使用Python实现SIS模型,模拟流行病传播过程
SIS模型(易感-感染-易感模型)是一种经典的传染病模型,用于描述疾病在一个固定人群中传播和消退的过程。在SIS模型中,个体在感染后不会获得长期免疫,康复后会重新回到易感状态。这种模型适用于那些感染后无法获得永久免疫的疾病,如普通感冒或某些性传播疾病。
SIS模型基于以下几个基本假设:
固定人群规模:总人口数 N 保持不变,不考虑出生、死亡和迁移。
同质混合:人群中每个人都有相同的概率与其他任何个体接触。
瞬时接触:传染过程发生在接触时,不考虑接触的持续时间。
易感与感染状态:个体只能处于易感(S)或感染(I)两种状态。
无长期免疫:感染者康复后立即恢复为易感状态,无法获得免疫力。
恒定参数:传播率 β 和康复率 γ 在整个过程中保持不变。
SIS模型通过描述易感者(S)和感染者(I)之间的人群流动,展示了疾病传播的动态过程。在该模型中,总人口(N)保持不变,人群在易感和感染两种状态之间转化:
易感者到感染者的转化:当易感者与感染者接触时,易感者有一定概率被感染,成为感染者。感染的速率由传播率(β)和当前感染者、易感者的数量决定。
感染者到易感者的转化:感染者在一定时间后康复,但由于无法获得长期免疫,他们会重新回到易感状态。康复的速率由康复率(γ)决定。
通过观察人群在这两种状态间的流动,可以理解疾病传播的主要驱动力及其长期趋势。这种模型特别适用于那些感染后不会形成长期免疫的疾病,如普通感冒等。
参数 | 含义 |
---|---|
N | 总人口数 |
β | 传播率,疾病传播的速率 |
γ | 康复率,感染者康复的速率 |
S | 易感者数量 |
I | 感染者数量 |
以下是SIS模型的流程图,展示了易感者和感染者之间的转化过程:
SIS模型的核心在于描述易感者和感染者数量随时间的变化,其数学表达式如下:
$$
\begin{cases}
\frac{dS}{dt} = -\beta \frac{SI}{N} + \gamma I \\
\frac{dI}{dt} = \beta \frac{SI}{N} - \gamma I
\end{cases}
$$
其中:
S(t):时间 t 时刻的易感者数量。
I(t):时间 t 时刻的感染者数量。
N = S + I:总人口数。
β:疾病传播率,表示每个感染者每天平均能感染的易感者数量。
γ:康复率,表示每个感染者每天康复并回到易感状态的比例。
易感者变化率 dS/dt:
感染者变化率 dI/dt:
SIS模型适用于以下类型的传染病流行条件:
在这些条件下,SIS模型能够有效地描述疾病的传播动态,并为公共卫生决策提供参考。
本节将详细展示如何使用Python实现SIS模型,包括条件设定、代码实现以及结果分析。
在进行模型模拟前,需要设定以下条件和参数:
总人口数 N:模型中考虑的人群总数,用于计算易感者和感染者的比例。在本模型中,总人口数假定为固定不变,忽略出生、死亡和迁移的影响。
传播率 β:每个感染者每天平均能够感染的易感者数量。传播率反映了疾病的传播速度,其大小取决于疾病本身的传染性、人与人之间的接触频率,以及接触时的防护措施(如戴口罩、保持社交距离)。
康复率 γ:每个感染者每天康复并回到易感状态的比例。康复率由疾病的恢复速度和治疗效果决定,通常也受医疗资源的可用性和干预措施的影响。
初始感染人数 I₀:模拟开始时的感染者数量,反映了疫情在初始阶段的严重程度。初始感染人数越多,疫情扩散的潜力越大。
初始易感人数 S₀:易感者为总人口数减去初始感染人数,表示在模拟开始时有多少人尚未受到感染。易感者数量的大小决定了疫情传播的潜在规模。
模拟时间:模拟从疫情开始到结束的时间跨度,以及时间点的分布。模拟时间设定为160天,能够捕捉疫情的初期爆发、发展高峰和后期稳定过程。
为模拟实际情况,设置以下具体参数:
总人口数 N = 21,858,000:假设人群规模为固定值。
传播率 β = 1.1:假设疾病传染性较高,且人与人之间接触频繁。
康复率 γ = 0.25:假设疾病的康复时间较短,感染者每天有25%的概率恢复。
初始感染人数 I₀ = 170:初始感染人数较少,疫情处于爆发初期。
初始易感人数 S₀ = N - I₀ = 21,857,830:大部分人群在初始阶段为易感状态。
模拟时间:从第0天到第160天,共160个时间点,涵盖疫情的完整传播过程。
通过这些参数的设定,可以较为全面地观察疫情在人群中的传播过程,并评估不同因素对传播动态的影响。
以下Python代码实现了SIS模型的模拟过程,并生成易感者和感染者人数随时间变化的图表。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
# 设置中文字体
plt.rcParams['font.family'] = ['SimHei'] # 或者 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# SIS模型微分方程
def sis_ode(t, y, N, beta, gamma):
S, I = y # 易感者和感染者数量
dS = -beta * S * I / N + gamma * I # 易感者的变化
dI = beta * S * I / N - gamma * I # 感染者的变化
return [dS, dI]
# 参数设置
N = 21858000 # 总人口数
beta = 1.1 # 传播率
gamma = 0.25 # 康复率
I0 = 170 # 初始感染人数
# 计算初始的易感者数量
S0 = N - I0
y0 = [S0, I0]
# 时间点设置
t_start = 0 # 模拟开始天数
t_end = 160 # 模拟结束天数
num_points = 160 # 时间点数量
t_eval = np.linspace(t_start, t_end, num_points)
# 求解微分方程
solution = solve_ivp(
sis_ode,
[t_start, t_end],
y0,
args=(N, beta, gamma),
t_eval=t_eval
)
# 检查求解是否成功
if solution.success:
S, I = solution.y
else:
raise RuntimeError("微分方程求解失败!")
# 绘制图形
plt.figure(figsize=(12, 6))
plt.plot(solution.t, S, label='易感者 S', color='blue')
plt.plot(solution.t, I, label='感染者 I', color='red')
plt.title(f'SIS 模型模拟结果 (β={beta}, γ={gamma}, N={N}, I0={I0})')
plt.xlabel('天数')
plt.ylabel('人数')
plt.legend()
plt.grid(True)
plt.show()
运行上述代码后,得到如下模拟结果:
图表解释:
从图中可以观察到:
这些结果表明,在SIS模型下,疾病会在群体中持续存在,并维持在一个稳定的感染水平。
关键观察点:
传播与康复的平衡:当传播率 β 和康复率 γ 达到一定平衡时,感染者人数不再显著增加或减少,系统进入稳定状态。
初始感染者的影响:初始感染人数 I₀ 对疾病传播的早期动态有显著影响,但对长期稳定状态的影响较小。
模型的敏感性:通过调整 β 和 γ 的值,可以显著改变感染者和易感者的动态变化,反映出模型对这些参数的高度敏感性。
进一步分析:
基本再生数 R₀:可以通过 R₀ = β/γ 计算得到。在本模型中,R₀ = 1.1/0.25 = 4.4,意味着每个感染者平均会传染4.4个易感者。这表明疾病具有较强的传播能力。
长期趋势:由于 R₀ > 1,疾病在长期内会在群体中持续存在,无法通过自然康复达到消退。
在实际应用中,传染病的传播过程可能会受到各种干预措施的影响。为了进一步提高模型的现实性,可以在SIS模型的基础上进行扩展,加入干预措施或改变状态流向。以下是一些可能的扩展方向:
引入隔离状态(Q),将一部分感染者隔离,减少他们与易感者的接触机会,从而降低传播率。
$$
\begin{cases}
\frac{dS}{dt} = -\beta \frac{SI}{N} + \gamma I \\
\frac{dI}{dt} = \beta \frac{SI}{N} - (\gamma + \delta) I \\
\frac{dQ}{dt} = \delta I
\end{cases}
$$
其中:
引入疫苗接种,将一部分易感者转化为免疫者(R),从而减少易感者数量。
$$
\begin{cases}
\frac{dS}{dt} = -\beta \frac{SI}{N} - \nu S + \gamma I \\
\frac{dI}{dt} = \beta \frac{SI}{N} - \gamma I \\
\frac{dR}{dt} = \nu S
\end{cases}
$$
其中:
引入潜伏者状态(E),即个体在感染后有一段时间处于潜伏期,尚未具有传染性。
$$
\begin{cases}
\frac{dS}{dt} = -\beta \frac{SI}{N} \\
\frac{dE}{dt} = \beta \frac{SI}{N} - \sigma E \\
\frac{dI}{dt} = \sigma E - \gamma I
\end{cases}
$$
其中:
将感染者分为轻度感染和重度感染,分别对应不同的传播率和康复率。
$$
\begin{cases}
\frac{dS}{dt} = -\beta_L \frac{SI_L}{N} - \beta_H \frac{SI_H}{N} \\
\frac{dI_L}{dt} = \beta_L \frac{SI_L}{N} - \gamma_L I_L \\
\frac{dI_H}{dt} = \beta_H \frac{SI_H}{N} - \gamma_H I_H
\end{cases}
$$
其中:
除了疫苗接种和隔离措施外,还可以考虑以下扩展,以进一步提高模型的现实性和应用范围:
描述:考虑不同地区之间的人口迁移,模拟疾病在多个区域的传播。
实现方法:
应用示例:
描述:引入年龄分层,不同年龄组的传播率和康复率可能不同。
实现方法:
应用示例:
描述:不再假设同质混合,采用复杂的接触网络模型,更真实地反映人群互动结构。
实现方法:
应用示例:
描述
考虑季节变化对传播率的影响,如流感在冬季传播更为严重。
实现方法
应用示例
描述:在同一人群中模拟多种病原体的竞争与共存,研究不同疾病之间的相互影响。
实现方法:
应用示例:
描述:考虑疾病通过环境媒介(如水源、空气)传播,增加模型的复杂性和现实性。
实现方法:
应用示例:
描述:将经济和社会因素纳入模型,研究其对疾病传播和控制的影响。
实现方法:
应用示例:
通过这些扩展,传染病模型能够更全面地反映现实世界中的复杂因素,提供更精准的预测和有效的干预策略支持,为公共卫生决策者提供更有力的科学依据。