我需要制作一个代码来获取具有“历史”的数学模型的相位肖像。我将在代码后解释。
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
答案 0 :(得分:0)
ode45
旨在解决常微分方程。常微分方程问题设置将有一些基本组件。
xdot = f(t, x)
是微分方程。
x(t=t0) = x0
是最初的条件。
t
是自变量,对应于您实现中的time
。
x
是因变量,对应于您的实施中的S
,I
和N
。
初始条件中的t0
和x0
与times(1)=1990
和S(1)
,I(1)
和N(1)
相对应。
剩下的任务是以MATLAB理解的方式定义f
。拥有所有这些组件后,ode45
即可使用。
定义f
可能是最困难的部分。在您的实施中,它与test_func
以及test_func
(P
,b
,m
,l
,{{所需的其他参数相对应1}})。
重要的是要注意,在您的情况下,这些参数也取决于时间。将它们写成u
,P(t)
,b(t)
,m(t)
和l(t)
可能更清楚。
在这种情况下,查看u(t)
函数可能会有所帮助,这是一个内置的线性插值函数。给定您的数据点,当interp1
isn'时,MATLAB可以估算P(t)
,b(t)
,m(t)
,l(t)
和u(t)
的值每5年一次。
t