数学建模 - Matlab ode45-for循环

时间:2017-01-27 13:30:53

标签: matlab math modeling ode45

我需要制作一个代码来获取具有“历史”的数学模型的相位肖像。我将在代码后解释。

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 =因疾病导致的死亡率

PS仅在不同时间段(P = S之前15年)代表同一事物,所有P值均为给出。

代码需要返回SIN的相位图。我绝对不是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

1 个答案:

答案 0 :(得分:0)

ode45旨在解决常微分方程。常微分方程问题设置将有一些基本组件。

xdot = f(t, x)

是微分方程。

x(t=t0) = x0

是最初的条件。

t是自变量,对应于您实现中的time

x是因变量,对应于您的实施中的SIN

初始条件中的t0x0times(1)=1990S(1)I(1)N(1)相对应。

剩下的任务是以MATLAB理解的方式定义f。拥有所有这些组件后,ode45即可使用。

定义f可能是最困难的部分。在您的实施中,它与test_func以及test_funcPbml,{{所需的其他参数相对应1}})。

重要的是要注意,在您的情况下,这些参数也取决于时间。将它们写成uP(t)b(t)m(t)l(t)可能更清楚。

在这种情况下,查看u(t)函数可能会有所帮助,这是一个内置的线性插值函数。给定您的数据点,当interp1 isn'时,MATLAB可以估算P(t)b(t)m(t)l(t)u(t)的值每5年一次。

t