【发布时间】:2017-06-13 04:54:48
【问题描述】:
我需要编写代码来获取具有“历史”的数学模型的相图。我会在代码之后解释。
close all;
clear all;
times = 1990:1:2015;
hold on
b=zeros(1,26); %75-2000 per 5 years
b(1:5)=0.0358;
b(6:10)=0.0339;
b(11:15)=0.0311;
b(16:20)=0.0275;
b(21:26)=0.0249;
m=zeros(1,26); %90-2015 per 5 years
m(1:5)=0.008;
m(6:10)=0.0031;
m(11:15)=0.0137;
m(16:20)=0.0147;
m(21:26)=0.0125;
l=zeros(1,26); %90-2015 per 5 years
l(1:5)=0.015;
l(6:10)=0.031;
l(11:15)=0.026;
l(16:20)=0.015;
l(21:26)=0.014;
u=zeros(1,26); %90-2015 per 5 years
u(1:5)=0.04;
u(6:10)=0.02;
u(11:15)=0.038;
u(16:20)=0.05;
u(21:26)=0.035;
S=zeros(1,26);
I=zeros(1,26);
N=zeros(1,26);
S(1)=18442000;
I(1)=186000; %1990
N(1)=18628000;
P=zeros(1,26); %15 years before S
P(1:5)=12788000;
P(6:10)=14731000;
P(11:15)=16968000;
P(16:20)=19696000;
P(21:26)=22893000;
for i=1:26
[time, xy] = ode45('test_func',times,[S(i) I(i) N(i) P(i) b(i) m(i) l(i) u(i)]);
plot(time,xy(:,1),'-g',time,xy(:,2),'-r',time,xy(:,3),'-b');
end
function rhs = test_func(t,xx)
S = xx(1);
I = xx(2);
N = xx(3);
P = xx(4);
b = xx(5);
m = xx(6);
l = xx(7);
u = xx(8);
Sdot=b*P-m*S-l*S*I;
Idot=l*S*I-(m+u)*I;
Ndot=Sdot+Idot;
rhs = [Sdot; Idot; Ndot; P; b; m; l; u;];
end
详细列表:
-
S=健康人群 -
I=感染人群 -
N=总人口 -
b=出生率(S之前 15 年) -
m=死亡率 -
l=接触后感染几率 -
u=疾病死亡率
P 和 S 代表相同的事物,只是在不同的时间段(P=S 之前的 15 年),还给出了所有 P 值。
代码需要返回S,I和N的相图。我绝对不能 100% 确定我的代码是否适合我的目标,但这就是我想出的。当前代码运行但永不结束。欢迎对我的代码提出任何建议或帮助修复错误。
如果需要,我还考虑在 ode45 和 plot 之间的 for 循环中添加以下内容:
if i<26
xy(i+1)=S(i+1);
xy(i+27)=I(i+1);
xy(i+53)=N(i+1);
end
【问题讨论】:
-
出现错误信息是因为
test_func中rhs和xx的尺寸不一样。您可以通过 2 个修订使尺寸相同:1)Sdot、Idot和Ndot的尺寸均为 1 x 26,因为b、m、l和u是 1 x 26。您应该只使用这些向量中的相关组件。 2) 您应该以与提供b、m、l和u相同的方式将P提供给test_func函数。否则,您将需要定义Pdot。 -
我对上面的帖子进行了更改,以便尺寸匹配,但正如我上面所说的仍然不是我希望的结果
-
嘿。我测试了您的代码的清理版本。运行时间不合理。我认为这是因为
test_func有问题。我怀疑数量的单位有问题。 -
Idot取决于l*S*I,大约是 1990 年的0.015*18442000*186000。514 亿/年的感染率对我来说听起来太高了。 -
您好,首先我要感谢您的帮助。因此,我将所有人口值除以 1000,运行仍然需要时间,我将尝试除以更多,然后将图中的轴乘以该数量。您如何看待我在原始帖子末尾编辑的部分?
标签: matlab math modeling ode45