matlab練習程序(傳染病模型)


最近新型冠狀病毒疫情越來越嚴重了,待在家中沒法出去,學習一下經典傳染病模型。

這里總結了五個模型,分別是SI模型,SIS模型,SIR模型,SIRS模型,SEIR模型。

這幾種模型的特點先介紹一下。

首先定義SEIR:

S為易感者 (Susceptible),指未得病者,但缺乏免疫能力,與感染者接觸后容易受到感染;

E為暴露者 (Exposed),指接觸過感染者,但暫無能力傳染給其他人的人,對潛伏期長的傳染病適用;

I為感病者 (Infective),指染上傳染病的人,可以傳播給 S 類成員,將其變為 E 類或 I 類成員;

R為康復者 (Recovered),指被隔離或因病愈而具有免疫力的人。如免疫期有限,R 類成員可以重新變為 S 類。

一、SI模型

該模型只考慮易感者和感病者,感病者不斷去感染易感者。

隨着時間推移,該模型感染者越來越多直到所有人都感染。

其微分方程為:

其中beta為感染率。

二、SIS模型 

該模型依然只考慮易感者和感病者,感病者不斷去感染易感者,這里感病者會得到治療恢復成易感者,不過恢復后依然可能得病。

隨着時間推移,該模型感染者和易感者會達到動態平衡。

其微分方程為:

其中beta為感染率,gamma為治愈率。

三、SIR模型

該模型考慮易感者、感病者與康復者,其中感病者不斷感染易感者,而感病者又不斷接受治療成為康復者,康復者因為得到抗體不會再成為易感者。

隨着時間推移,該模型康復者越來越多,最終所有人都成為康復者。

其微分方程為:

其中beta為感染率,gamma為治愈率。

四、SIRS模型

該模型考慮易感者、感病者與康復者,其中感病者不斷感染易感者,而感病者不斷接受治療成為康復者,康復者獲得抗體能夠抵抗一段時間,不過最終還是會成為易感者。

該模型和SIS模型很像,區別就是康復者能夠抵抗一段時間,也就是有一定的復感率,而SIS模型的復感率為1。

隨着時間推移,該模型同樣會達到一個動態平衡。

其微分方程為:

其中beta為感染率,gamma為治愈率,alpha為復感率。

五、SEIR模型

該模型四種參與者全部考慮,其中感病者不斷感染易感者,易感者得到病毒會成為潛伏者,潛伏者依然能夠使易感者感染,潛伏者有一定概率自己痊愈,感染者接受治療也能夠痊愈,痊愈后不再能夠感染該病。

隨着時間推移,該模型最終也是所有人都會成為康復者。

其微分方程為:

其中beta為感染率,gamma1為潛伏期康復率,gamma2為患者康復率,alpha為潛伏期轉陽率。

各模型matlab代碼如下,其中ode45為4階龍格庫塔法解微分方程,具體實現見上一篇文章

main.m:

clear all;
close all;
clc;

%%SI模型
[t,h] = ode45(@SI,[0 120],0.01);    %0.01為初始感染人口占比
plot(t,h,'r');
hold on;
plot(t,1-h,'g');
legend('感染人口占比I','健康人口占比S');
title('SI模型')

%%SIS模型
figure;
[t,h] = ode45(@SIS,[0 120],0.01);   %0.01為初始感染人口占比
plot(t,h,'r');
hold on;
plot(t,1-h,'g');
legend('感染人口占比I','健康人口占比S');
title('SIS模型')

%%SIR模型
figure;
[t,h] = ode45(@SIR,[0 300],[0.01 0.99]);    %[初始感染人口占比 初始健康人口占比]
plot(t,h(:,1),'r',t,h(:,2),'b');
hold on;
plot(t,1-h(:,2),'g');
legend('感染人口占比I','健康人口占比S','治愈人口占比R');
title('SIR模型')

%%SIRS模型
figure;
[t,h] = ode45(@SIRS,[0 300],[0.01 0.99 0]); %[初始感染人口占比 初始健康人口占比 初始治愈人口占比]
plot(t,h(:,1),'r',t,h(:,2),'b');
hold on;
plot(t,h(:,3),'g');
legend('感染人口占比I','健康人口占比S','治愈人口占比R');
title('SIRS模型')

%%SEIR模型
figure;
[t,h] = ode45(@SEIR,[0 300],[0.01 0.98 0.01 0]);  %[初始感染人口占比 初始健康人口占比 初始潛伏人口占比 初始治愈人口占比]
plot(t,h(:,1),'r');
hold on;
plot(t,h(:,2),'b');
plot(t,h(:,3),'m');
plot(t,h(:,4),'g');
legend('感染人口占比I','健康人口占比S','潛伏人口占比E','治愈人口占比R');
title('SEIR模型')

SI.m:

function dy=SI(t,x)
beta = 0.1;    %感染率
dy=beta*x*(1-x);

SIS.m:

function dy=SIS(t,x)
beta = 0.1;    %感染率
gamma= 0.02;    %治愈率
dy=beta*x*(1-x)-gamma*x;

SIR.m:

function dy=SIR(t,x)
beta = 0.1;    %感染率
gamma = 0.02;    %治愈率
dy=[beta*x(1)*x(2)-gamma*x(1);
    -beta*x(1)*x(2)];

SIRS.m:

function dy=SIRS(t,x)
beta = 0.1;      %感染率
gamma = 0.02;    %治愈率
alpha = 0.01;    %治愈復感率
dy=[beta*x(1)*x(2)-gamma*x(1);
    -beta*x(1)*x(2)+alpha*x(3)
    gamma*x(1) - alpha*x(3)];

SEIR.m:

function dy=SEIR(t,x)
beta = 0.1;         %感染率
gamma1 = 0.05;      %潛伏期治愈率
gamma2 = 0.02;      %患者治愈率
alpha = 0.5;        %潛伏期轉陽率
dy=[alpha*x(3) - gamma2*x(1);
    -beta*x(1)*x(2);
    beta*x(1)*x(2) - (alpha+gamma1)*x(3);
    gamma1*x(3)+gamma2*x(1)];

模型結果如下:

SI模型:

SIS模型:

SIR模型:

SIRS模型:

SEIR模型:

如果已經有模型和數據,如何擬合出參數,可以參考這篇文章

參考:

https://baike.baidu.com/item/%E4%BC%A0%E6%9F%93%E7%97%85%E6%A8%A1%E5%9E%8B/5130035


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM