2020.2.5 更新:
code中S0, I0, R0均是比例,不是具体人数,请自行通过各个类别人数计算各类型人群比例。
原文:
传染病模型有四种状态:S(易感态)、I(感染态)、R(免疫态)、E(潜伏期)。
SIR模型是传染病模型中最经典的模型。SIR模型中,染病人群为传染的源头,他通过一定的几率把传染病传给易感人群,他自己也有一定的几率/可以被治愈并免疫,或者死亡;易感人群一旦被感染,就又成为了新的传染源。将人群划分为三类,易感染者(Susceptible)、已感染者(Infective)和已恢复者(Recovered )。
SIR模型有两个阶段:易感人群与感染人员接触时被传染,接触速率为 beta
感染人群以固定平均速率 gamma 恢复或死亡
SIR模型的建立基于以下三个假设:
⑴不考虑人口的出生、死亡、流动等种群动力因素。人口始终保持一个常数,即N(t)≡K。
⑵一个病人一旦与易感者接触就必然具有一定的传染力。假设 t 时刻单位时间内,一个病人能传染的易感者数目与此环境内易感者总数s(t)成正比,比例系数为β,从而在t时刻单位时间内被所有病人传染的人数为βs(t)i(t)。
⑶ t 时刻,单位时间内从染病者中移出的人数与病人数量成正比,比例系数为γ,单位时间内移出者的数量为γi(t)。
基于以上三个假设条件,感染机制如下所示:
在以上三个基本假设条件下,可知:当易感个体和感染个体充分混合时,感染个体的增长率为
,易感个体的下降率为
,恢复个体的增长率为
。易感者从患病到移出的过程可以用微分方程表示如下:
import scipy.integrate
import numpy as np
import matplotlib.pyplot as plt
# model
def SIR_model(y, t, beta, gamma):
S, I, R = y
dS_dt = -beta * S * I
dI_dt = beta * S * I - gamma * I
dR_dt = gamma * I
return ([dS_dt, dI_dt, dR_dt])
# initialization
S0 = 0.9 # ratio
I0 = 0.1 # ratio
R0 = 0.0 # ratio
beta = 0.35
gamma = 0.1
# time vector
t = np.linspace(0, 100, 10000)
# result
res = scipy.integrate.odeint(SIR_model, [S0, I0, R0], t, args=(beta, gamma))
res = np.array(res)
# plot
plt.figure(figsize=[6, 4])
plt.plot(t, res[:, 0], label='S(t)')
plt.plot(t, res[:, 1], label='I(t)')
plt.plot(t, res[:, 2], label='R(t)')
plt.legend()
plt.grid()
plt.xlabel('time')
plt.ylabel('proportions')
plt.title('SIR model simulation')
plt.show()
结果图:
更多有关传染病数学模型的讨论可参考:
参考资料: