最近新型冠狀病毒疫情越來越嚴重了,待在家中沒法出去,學習一下經典傳染病模型。
這里總結了五個模型,分別是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:
1 clear all; 2 close all; 3 clc; 4
5 %%SI模型 6 [t,h] = ode45(@SI,[0 120],0.01); %0.01為初始感染人口占比 7 plot(t,h,'r'); 8 hold on; 9 plot(t,1-h,'g'); 10 legend('感染人口占比I','健康人口占比S'); 11 title('SI模型') 12
13 %%SIS模型 14 figure; 15 [t,h] = ode45(@SIS,[0 120],0.01); %0.01為初始感染人口占比 16 plot(t,h,'r'); 17 hold on; 18 plot(t,1-h,'g'); 19 legend('感染人口占比I','健康人口占比S'); 20 title('SIS模型') 21
22 %%SIR模型 23 figure; 24 [t,h] = ode45(@SIR,[0 300],[0.01 0.99]); %[初始感染人口占比 初始健康人口占比] 25 plot(t,h(:,1),'r',t,h(:,2),'b'); 26 hold on; 27 plot(t,1-h(:,2),'g'); 28 legend('感染人口占比I','健康人口占比S','治愈人口占比R'); 29 title('SIR模型') 30
31 %%SIRS模型 32 figure; 33 [t,h] = ode45(@SIRS,[0 300],[0.01 0.99 0]); %[初始感染人口占比 初始健康人口占比 初始治愈人口占比] 34 plot(t,h(:,1),'r',t,h(:,2),'b'); 35 hold on; 36 plot(t,h(:,3),'g'); 37 legend('感染人口占比I','健康人口占比S','治愈人口占比R'); 38 title('SIRS模型') 39
40 %%SEIR模型 41 figure; 42 [t,h] = ode45(@SEIR,[0 300],[0.01 0.98 0.01 0]); %[初始感染人口占比 初始健康人口占比 初始潛伏人口占比 初始治愈人口占比] 43 plot(t,h(:,1),'r'); 44 hold on; 45 plot(t,h(:,2),'b'); 46 plot(t,h(:,3),'m'); 47 plot(t,h(:,4),'g'); 48 legend('感染人口占比I','健康人口占比S','潛伏人口占比E','治愈人口占比R'); 49 title('SEIR模型')
SI.m:
1 function dy=SI(t,x) 2 beta = 0.1; %感染率 3 dy=beta*x*(1-x);
SIS.m:
1 function dy=SIS(t,x) 2 beta = 0.1; %感染率 3 gamma= 0.02; %治愈率 4 dy=beta*x*(1-x)-gamma*x;
SIR.m:
1 function dy=SIR(t,x) 2 beta = 0.1; %感染率 3 gamma = 0.02; %治愈率 4 dy=[beta*x(1)*x(2)-gamma*x(1); 5 -beta*x(1)*x(2)];
SIRS.m:
1 function dy=SIRS(t,x) 2 beta = 0.1; %感染率 3 gamma = 0.02; %治愈率 4 alpha = 0.01; %治愈復感率 5 dy=[beta*x(1)*x(2)-gamma*x(1); 6 -beta*x(1)*x(2)+alpha*x(3) 7 gamma*x(1) - alpha*x(3)];
SEIR.m:
1 function dy=SEIR(t,x) 2 beta = 0.1; %感染率 3 gamma1 = 0.05; %潛伏期治愈率 4 gamma2 = 0.02; %患者治愈率 5 alpha = 0.5; %潛伏期轉陽率 6 dy=[alpha*x(3) - gamma2*x(1); 7 -beta*x(1)*x(2); 8 beta*x(1)*x(2) - (alpha+gamma1)*x(3); 9 gamma1*x(3)+gamma2*x(1)];
模型結果如下:
SI模型:
SIS模型:
SIR模型:
SIRS模型:
SEIR模型: