根据12月至今以来西安的疫情数据,笔者建立了Logistic模型,使用MATLAB得到了相关参数。

预测结果

xian

  • \(K=2040\),也即最大感染人数为2040人。
  • \(r=0.339\),这个参数代表了增长速率。
  • 预测拐点的时间\(t_1=23\),也即1月1日。
  • 预测稳定的时间\(t_2=38\),也即1月16日。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
%% 初始化

clear;
close all;

%% 导入数据

data = xlsread('\西安疫情.xlsx');
x = data(:, 1);
dy = data(:, 2);
y = data(:, 3);
n = size(y, 1);

%% 拟合与计算

fun = @(k, x) k(3).*k(1).*exp(k(2).*x)./(k(1)+k(3).*(exp(k(2).*x)-1));
[k, resnorm] = lsqcurvefit(fun, [1000 1 1], x, y);

%% 绘制结果图

figure();
scatter(x, y, 'x');
hold on;
x = 0 : 40;
z = fun(k, x);
plot(x, z, 'Color', 'b');
grid on;
legend('公开数据', '拟合结果');
xlabel('时间(12月9日记为第0天)');
ylabel('确诊人数');

%% 输出结果

fprintf('\n使用Logistic函数进行建模, 预测结果如下: \n\n最大数量 K = %f, \n增长速率 r = %f, ', k(1), k(2));
t1 = ceil(1/k(2) * log((k(1) - y(1))/y(1)));
fprintf('\n拐点时间 t1 = %d, ', t1);
for i = t1 : 50
if z(i + 1) - z(i) < 2
t2 = i;
break;
end
end
fprintf('\n稳定时间 t2 = %d. \n\n', t2);