|
利用ode45函数求解微分方程组
一种可自愈的传染病,未患病的易感人群 S 以一定概率感染之后,成为潜伏期感染者 E,之后部分潜伏期感染者发展成为显性感染者 I,另一部分成为隐性感染者 A,显性和隐性感染者在病愈后成为恢复者 R。随疾病的自由传播,不同类型的人群数量可用如下动力学微分方程来描述:

假设当疾病开始传播 D 天后,防疫部门发现疫情,并开始采取限制措施。现 在有两种限制措施:(1)对显性感染者 I 采取严格隔离措施直至痊愈,阻断显性感染者与其他 人群的接触和传播。采取这一措施后人群数量的变化为:

(2)采用持续 Q 日的所有人群居家隔离措施,但隔离期满后直接恢复原有 的自由接触状态,而未对人员进行全面检测以发现感染者。隔离期间的人群数量变化为:


<hr/>编程求解
主程序
clc;
clear all;
close all;
x0 = [1665;0;2; 0; 0];%初值
tspan = [0 7];%设置变量范围
tspan1 = [1 14];
tspan2 = [2 28];
[t,x] = ode45(@myfun,tspan,x0);
[t1,x1] = ode45(@myfun,tspan1,x0);
[t2,x2] = ode45(@myfun,tspan2,x0);
%画图
figure;
subplot(3,1,1);
plot(t,x(:,1),&#39;black&#39;);
title(&#39;持续7日所有人隔离政策&#39;)
legend(&#39;为患病的感染人群S&#39;)
xlabel(&#39;t/天数&#39;)
subplot(3,1,2);
plot(t1,x1(:,1),&#39;r&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续14日所有人隔离政策&#39;)
legend(&#39;为患病的感染人群S&#39;)
subplot(3,1,3);
plot(t2,x2(:,1),&#39;b&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续28日所有人隔离政策&#39;)
legend(&#39;为患病的感染人群S&#39;)
figure;
subplot(3,1,1);
plot(t,x(:,2),&#39;g&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续7日所有人隔离政策&#39;)
legend(&#39;潜伏期感染者E&#39;)
subplot(3,1,2);
plot(t1,x1(:,2),&#39;r&#39;);
title(&#39;持续14日所有人隔离政策&#39;)
legend(&#39;潜伏期感染者E&#39;)
xlabel(&#39;t/天数&#39;)
subplot(3,1,3);
plot(t2,x2(:,2),&#39;b&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续28日所有人隔离政策&#39;)
legend(&#39;潜伏期感染者E&#39;)
figure;
subplot(3,1,1);
plot(t,x(:,3),&#39;b&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续7日所有人隔离政策&#39;)
legend(&#39;显性感染者I&#39;)
subplot(3,1,2);
plot(t1,x1(:,3),&#39;r&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续14日所有人隔离政策&#39;)
legend(&#39;显性感染者I&#39;)
subplot(3,1,3);
plot(t2,x2(:,3),&#39;g&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续28日所有人隔离政策&#39;)
legend(&#39;显性感染者I&#39;)
figure;
subplot(3,1,1);
plot(t,x(:,4),&#39;y&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续7日所有人隔离政策&#39;)
legend(&#39;隐性感染者A&#39;)
subplot(3,1,2);
plot(t1,x1(:,4),&#39;r&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续14日所有人隔离政策&#39;)
legend(&#39;隐性感染者A&#39;)
subplot(3,1,3);
plot(t2,x2(:,4),&#39;b&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续28日所有人隔离政策&#39;)
legend(&#39;隐性感染者A&#39;)
figure;
subplot(3,1,1);
plot(t,x(:,5),&#39;r&#39;);
title(&#39;持续7日所有人隔离政策&#39;)
legend(&#39;恢复者R&#39;)
xlabel(&#39;t/天数&#39;)
subplot(3,1,2);
plot(t1,x1(:,5),&#39;g&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续14日所有人隔离政策&#39;)
legend(&#39;恢复者R&#39;)
subplot(3,1,3);
plot(t2,x2(:,5),&#39;b&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;持续14日所有人隔离政策&#39;)
legend(&#39;恢复者R&#39;)
tspan = [0 7];%设置变量范围
tspan1 = [1 14];
tspan2 = [2 28];
[t3,x3] = ode45(@myfun1,tspan,x0);
[t4,x4] = ode45(@myfun1,tspan1,x0);
[t5,x5] = ode45(@myfun1,tspan2,x0);
%画图
figure;
subplot(3,1,1);
plot(t3,x3(:,1),&#39;black&#39;);
title(&#39;7日显性感染者I痊愈&#39;)
legend(&#39;为患病的感染人群S&#39;)
xlabel(&#39;t/天数&#39;)
subplot(3,1,2);
plot(t4,x4(:,1),&#39;r&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;14日显性感染者I痊愈&#39;)
legend(&#39;为患病的感染人群S&#39;)
subplot(3,1,3);
plot(t5,x5(:,1),&#39;b&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;28日显性感染者I痊愈&#39;)
legend(&#39;为患病的感染人群S&#39;)
figure;
subplot(3,1,1);
plot(t3,x3(:,2),&#39;g&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;7日显性感染者I痊愈&#39;)
legend(&#39;潜伏期感染者E&#39;)
subplot(3,1,2);
plot(t4,x4(:,2),&#39;r&#39;);
title(&#39;14日显性感染者I痊愈&#39;)
legend(&#39;潜伏期感染者E&#39;)
xlabel(&#39;t/天数&#39;)
subplot(3,1,3);
plot(t5,x5(:,2),&#39;b&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;28日显性感染者I痊愈&#39;)
legend(&#39;潜伏期感染者E&#39;)
figure;
subplot(3,1,1);
plot(t3,x3(:,3),&#39;b&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;7日显性感染者I痊愈&#39;)
legend(&#39;显性感染者I&#39;)
subplot(3,1,2);
plot(t4,x4(:,3),&#39;r&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;14日显性感染者I痊愈&#39;)
legend(&#39;显性感染者I&#39;)
subplot(3,1,3);
plot(t5,x5(:,3),&#39;g&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;28日显性感染者I痊愈&#39;)
legend(&#39;显性感染者I&#39;)
figure;
subplot(3,1,1);
plot(t3,x3(:,4),&#39;y&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;7日显性感染者I痊愈&#39;)
legend(&#39;隐性感染者A&#39;)
subplot(3,1,2);
plot(t4,x4(:,4),&#39;r&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;14日显性感染者I痊愈&#39;)
legend(&#39;隐性感染者A&#39;)
subplot(3,1,3);
plot(t5,x5(:,4),&#39;b&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;28日显性感染者I痊愈&#39;)
legend(&#39;隐性感染者A&#39;)
figure;
subplot(3,1,1);
plot(t3,x3(:,5),&#39;r&#39;);
title(&#39;7日显性感染者I痊愈&#39;)
legend(&#39;恢复者R&#39;)
xlabel(&#39;t/天数&#39;)
subplot(3,1,2);
plot(t4,x4(:,5),&#39;g&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;14日显性感染者I痊愈&#39;)
legend(&#39;恢复者R&#39;)
subplot(3,1,3);
plot(t5,x5(:,5),&#39;b&#39;);
xlabel(&#39;t/天数&#39;)
title(&#39;28日显性感染者I痊愈&#39;)
legend(&#39;恢复者R&#39;)
xlswrite(&#39;x.xlsx&#39;,x);
xlswrite(&#39;x1.xlsx&#39;,x1);
xlswrite(&#39;x2.xlsx&#39;,x2);
xlswrite(&#39;x3.xlsx&#39;,x3);
xlswrite(&#39;x4.xlsx&#39;,x4);
xlswrite(&#39;x5.xlsx&#39;,x5);微分方程组程序1
function dydt = myfun1(t,y)
%y(1) = S y(2) = E y(3) = I ,y(4) = A y(5) = R
%对显性感染者I采取隔离措施直至痊愈
%初始化参数
beta = 0.00105;
k = 0.5;
p = 0.14;
omiga = 0.53;
omiga1 = 0.83;
gama = 0.23;
gama1 = 0.24;
%定义函数
dydt = zeros(5,1);%初始化
dydt(1) = -beta*y(1)*k*y(1);
dydt(2) = beta*y(1)*k*y(1)-(1-p)*omiga*y(2)-p*omiga1*y(2);
dydt(3) = (1-p)*omiga*y(2)-gama*y(3);
dydt(4) = p*omiga1*y(2)-gama1*y(4);
dydt(5) = gama *y(3)+gama1*y(4);
end微分方程组程序2
function dydt = myfun(t,y)
%y(1) = S y(2) = E y(3) = I ,y(4) = A y(5) = R
%采用持续Q日政策
%初始化参数
beta = 0.00105;
k = 0.5;
p = 0.14;
omiga = 0.53;
omiga1 = 0.83;
gama = 0.23;
gama1 = 0.24;
%定义函数
dydt = zeros(5,1);%初始化
dydt(1) = 0;
dydt(2) = -(1-p)*omiga*y(2)-p*omiga1*y(2);
dydt(3) = (1-p)*omiga*y(2)-gama*y(3);
dydt(4) = p*omiga1*y(2)-gama1*y(4);
dydt(5) = gama *y(3)+gama1*y(4);
end结果










<hr/>本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
<hr/>作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙 |
|