最近新型冠狀病毒疫情越來越嚴重了,待在家中沒法出去,學習一下經典傳染病模型。
這里總結了五個模型,分別是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