Python:SEIR传染病模型

Hello,大家好!好久没有更新了,今天给大家介绍一个非常经典的模型——SEIR传染病模型!

模型介绍

传染病的基本数学模型,研究传染病的传播速度、空间范围、传播途径、动力学机理等问题,以指导对传染病的有效地预防和控制。常见的传染病模型按照传染病类型分为 SI、SIR、SIRS、SEIR 模型等,按照传播机理又分为基于常微分方程、偏微分方程、网络动力学的不同类型。

S、E、I、R代表的含义

S、E、I、R是传染病流行范围内的四类人群:易感者(Susceptible)、暴露者(Exposed)、感染者(Infectious)、康复者(Recovered)

类型解释
易感者(Susceptible)未得病者,但缺乏免疫能力,与感染者接触后容易受到感染
暴露者(Exposed)接触过感染者,但暂无能力传染给其他人的人,对潜伏期长的传染病适用
感染者(Infectious)染上传染病的人,可以传播给 S 类成员,将其变为 E 类或 I 类成员
康复者(Recovered)被隔离或因病愈而具有免疫力的人。如免疫期有限,R 类成员可以重新变为 S 类

注:有些文章里面对于R的解释会用抵抗者(Resistant)来解释,会将死亡人群也划分在R中。

模型建立

变量解释

变量解释
S S S易感者人数
E E E潜伏者人数
I I I感染者人数
R R R康复者人数
r 1 r_1 r1每个感染者每天接触的平均人数
r 2 r_2 r2每个潜伏着每天接触的平均人数
β 1 \beta_1 β1易感者被感染者感染的概率
β 2 \beta_2 β2易感者被潜伏者感染的概率
α \alpha α潜伏者转化为感染者的概率(潜伏期的倒数)
γ \gamma γ康复概率
N N N总人数

建立微分方程

d S d t = − r 1 β I S N − r 2 β 2 E S N d E d t = r 1 β 1 I S N + r 2 β 2 E S N − α E d I d t = α E − γ I d R d t = γ I \frac{dS}{dt}=-\frac{r_1\beta IS}{N}-\frac{r_2\beta_2 ES}{N}\\ \frac{dE}{dt}=\frac{r_1\beta_1IS}{N}+\frac{r_2\beta_2ES}{N}-\alpha E\\ \frac{dI}{dt}=\alpha E-\gamma I\\ \frac{dR}{dt}=\gamma I dtdS=Nr1βISNr2β2ESdtdE=Nr1β1IS+Nr2β2ESαEdtdI=αEγIdtdR=γI

转化迭代形式

d S d t = − r 1 β I S N − r 2 β 2 E S N \frac{dS}{dt}=-\frac{r_1\beta IS}{N}-\frac{r_2\beta_2 ES}{N} dtdS=Nr1βISNr2β2ES为例

d S d t = − r 1 β I S N − r 2 β 2 E S N \frac{dS}{dt}=-\frac{r_1\beta IS}{N}-\frac{r_2\beta_2 ES}{N} dtdS=Nr1βISNr2β2ES
左右两边求积分
∫ n − 1 n d S d t d t = ∫ n − 1 n ( − r 1 β I S N − r 2 β 2 E S N ) d t \int_{n-1}^{n}\frac{dS}{dt}dt=\int_{n-1}^{n}(-\frac{r_1\beta IS}{N}-\frac{r_2\beta_2 ES}{N})dt n1ndtdSdt=n1n(Nr1βISNr2β2ES)dt
等号右边使用左矩形公式( ∫ a b f ( x ) d x ≈ ( b − a ) f ( a ) \int_a^bf(x)dx\approx(b-a)f(a) abf(x)dx(ba)f(a)
S n − S n − 1 = − r 1 β 1 I n − 1 S n − 1 N − r 2 β 2 E n − 1 S n − 1 N S_{n}-S_{n-1}=-\frac{r_1\beta_1I_{n-1}S_{n-1}}{N}-\frac{r_2\beta_2 E_{n-1}S_{n-1}}{N} SnSn1=Nr1β1In1Sn1Nr2β2En1Sn1
整理得
S n = S n − 1 − r 1 β 1 I n − 1 S n − 1 N − r 2 β 2 E n − 1 S n − 1 N S_{n}=S_{n-1}-\frac{r_1\beta_1I_{n-1}S_{n-1}}{N}-\frac{r_2\beta_2 E_{n-1}S_{n-1}}{N} Sn=Sn1Nr1β1In1Sn1Nr2β2En1Sn1

同理可得
S n = S n − 1 − r 1 β 1 I n − 1 S n − 1 N − r 2 β 2 E n − 1 S n − 1 N E n = E n − 1 + r 1 β 1 I n − 1 S n − 1 N + r 2 β 2 E n − 1 S n − 1 N − α E n − 1 I n = I n − 1 + α E n − 1 − γ I n − 1 R n = R n − 1 + γ I n − 1 S_{n}=S_{n-1}-\frac{r_1\beta_1I_{n-1}S_{n-1}}{N}-\frac{r_2\beta_2 E_{n-1}S_{n-1}}{N}\\ E_{n}=E_{n-1}+\frac{r_1\beta_1I_{n-1}S_{n-1}}{N}+\frac{r_2\beta_2E_{n-1}S_{n-1}}{N}-\alpha E_{n-1}\\ I_{n}=I_{n-1}+\alpha E_{n-1}-\gamma I_{n-1}\\ R_{n}=R_{n-1}+\gamma I_{n-1} Sn=Sn1Nr1β1In1Sn1Nr2β2En1Sn1En=En1+Nr1β1In1Sn1+Nr2β2En1Sn1αEn1In=In1+αEn1γIn1Rn=Rn1+γIn1

Python实现

首先,定义S、E、I、R四类人群,并设置初始人数:

N = 96400000  # 人口总数
E = []  # 潜伏携带者
E.append(0)
I = []  # 传染者
I.append(17)
S = []  # 易感者
S.append(N - I[0])
R = []  # 抵抗者
R.append(0)

设置各参数的初始值:

r = 21  # 传染者接触人数
b = 0.048  # 传染者传染概率
a = 0.13  # 潜伏者患病概率
r2 = 21  # 潜伏者接触人数
b2 = 0.048  # 潜伏者传染概率
y = 0.066  # 康复概率
T = [i for i in range(0, 160)]  # 时间

利用迭代公式计算每一天四类群体的人数:

for i in range(0, len(T) - 1):
    S.append(S[i] - r * b * S[i] * I[i] / N - r2 * b2 * S[i] * E[i] / N)
    E.append(E[i] + r * b * S[i] * I[i] / N - a * E[i] + r2 * b2 * S[i] * E[i] / N)
    I.append(I[i] + a * E[i] - y* I[i])
    R.append(R[i] + y * I[i])

最后,可视化来看下模拟的效果*(完整代码已封装,文末关注公众号即可获得)*:

if __name__ == "__main__":
    T = [i for i in range(160)]
    s = SEIR(T, 96400000, 0, 17, 0, 21, 21, 0.048, 0.048, 0.13, 0.066)
    s.plot()

在这里插入图片描述

总结

传染病模型是一个非常经典的模型,不仅可以用在疾病的传播模拟上,经济领域、网络舆情传播等都可以使用。并且本文仅仅做了最简单的建模,里面的各类参数的设定都可以根据具体问题或实际情况,做更优的调整。

获得源代码

关注公众号,回复“SEIR”即可获得源代码,谢谢大家支持!
在这里插入图片描述

  • 23
    点赞
  • 175
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值