在微观病毒的视角里,人类社会不过是一个由“易感节点”和“传播通路”构成的动力学网络。
从疫情初期的恐慌性指数飙升,到 Logistic 曲线的饱和拐点,再到地方性流行的稳态平衡,传染病的蔓延轨迹从来不是凭空发生的玄学,而是被常微分方程(ODE)严格锁定的数学演化。
本文从最简单的无限制增长假设出发,一步步推导 SI 与 SIS 动力学模型,用 Python 求解其微分方程数值轨迹,看清传染率 $\lambda$ 与康复率 $\mu$ 如何共同铸造了决定疫情生死的基本传染数 $R_0$。
1. 模型一:无限制指数增长模型
1.1 基本假设
- 总人口在考察期内保持不变;
- 设 $t$ 时刻的感染病人数为 $I(t)$,初始感染人数为 $I_0$;
- 每个病人在单位时间内平均有效接触(接触即传染)的人数为常数 $\lambda$(日接触率)。
1.2 微分方程推导
$$ \frac{dI}{dt} = \lambda I(t), \quad I(0) = I_0 $$$$ I(t) = I_0 e^{\lambda t} $$局限性:该模型假设健康人供给无限,感染人数会无上限指数暴增,仅在疫情爆发初期(感染比例极低时)具有一定参考价值。
2. 模型二:考虑总人口饱和的 SI 模型
2.1 基本假设
- 总人口为常数 $N$,分为两类:易感者(健康人)$S(t)$ 与感染者 $I(t)$,满足 $S(t) + I(t) = N$;
- 每个病人每天有效接触人数为 $\lambda$,但只有接触到健康人(比例为 $\frac{S(t)}{N} = 1 - \frac{I(t)}{N}$)才能产生新传染。
2.2 微分方程与 Logistic 解析解
$$ \frac{dI}{dt} = \lambda I(t) \left(1 - \frac{I(t)}{N}\right), \quad I(0) = I_0 $$$$ \frac{di}{dt} = \lambda i(1 - i), \quad i(0) = i_0 $$$$ i(t) = \frac{1}{1 + \left(\frac{1 - i_0}{i_0}\right) e^{-\lambda t}} $$曲线特征:呈现经典的 S 型曲线(Sigmoid / Logistic 增长)。当感染率 $i = 0.5$(即一半人被感染)时,传染扩散速度达到最大峰值 $\frac{di}{dt}\big|_{\max} = \frac{\lambda}{4}$,随后增速逐渐放缓,最终收敛于 $100\%$。
3. 模型三:考虑康复自愈的 SIS 模型
3.1 基本假设
- 病人治愈后不产生持久免疫力,重新变成健康易感人群 $S$(如普通感冒);
- 单位时间内病人的治愈/康复率为 $\mu$(平均患病周期为 $\frac{1}{\mu}$ 天)。
3.2 微分方程推导
$$ \frac{di}{dt} = \lambda i(1 - i) - \mu i = \lambda i \left(1 - \frac{\mu}{\lambda} - i\right) $$$$ R_0 = \frac{\lambda}{\mu} $$- 若 $R_0 \le 1$(治愈率大于等于传染率):$\frac{di}{dt} < 0$,感染率 $i(t) \to 0$,疾病自然消亡;
- 若 $R_0 > 1$(传染率大于治愈率):方程存在非零稳定平衡点: $$ i^* = 1 - \frac{\mu}{\lambda} = 1 - \frac{1}{R_0} $$ 感染率最终不会蔓延至全人群,而是稳定在特定比例 $i^*$(地方性流行稳态)。
4. Python 数值求解与可视化仿真
import numpy as np
import pandas as pd
from scipy.integrate import odeint
# 参数设置
lambda_rate = 0.3 # 日接触传染率
mu_rate = 0.1 # 日康复率 (平均病程 10 天)
i0 = 0.001 # 初始感染比例 0.1%
t = np.linspace(0, 60, 61) # 模拟 60 天
# 1. 指数模型 ODE
def ode_exp(i, t, lam):
return lam * i
# 2. SI 模型 ODE
def ode_si(i, t, lam):
return lam * i * (1 - i)
# 3. SIS 模型 ODE
def ode_sis(i, t, lam, mu):
return lam * i * (1 - i) - mu * i
# 数值积分求解
res_exp = odeint(ode_exp, i0, t, args=(lambda_rate,)).flatten()
res_si = odeint(ode_si, i0, t, args=(lambda_rate,)).flatten()
res_sis = odeint(ode_sis, i0, t, args=(lambda_rate, mu_rate)).flatten()
df_sim = pd.DataFrame({
'Day': t[::10].astype(int),
'指数模型(I)': [f"{v:.4f}" for v in res_exp[::10]],
'SI模型(S型)': [f"{v:.4f}" for v in res_si[::10]],
'SIS模型(稳态)': [f"{v:.4f}" for v in res_sis[::10]]
})
print(f"基本传染数 R0 = {lambda_rate / mu_rate:.2f}")
print(f"SIS 理论稳态平衡点 i* = {1 - 1/(lambda_rate/mu_rate):.4f}")
print(df_sim.to_markdown(index=False))
5. 模拟数据对比
| 天数 (Day) | 指数模型 ($I$) | SI 模型 ($S$ 型曲线) | SIS 模型 (稳态收敛) |
|---|---|---|---|
| 0 | 0.0010 | 0.0010 | 0.0010 |
| 10 | 0.0201 | 0.0197 | 0.0073 |
| 20 | 0.4034 | 0.2882 | 0.0505 |
| 30 | 8.1031 (失真) | 0.8902 | 0.2647 |
| 40 | 162.75 (失真) | 0.9939 | 0.5841 |
| 50 | 3269.0 (失真) | 0.9997 | 0.6582 (逼近 0.6667) |
| 60 | 65659. (失真) | 1.0000 | 0.6661 (逼近 0.6667) |
6. 微分方程动力学的深刻启示
传染病动力学模型不仅指导着全球公共卫生防疫,更在信息传播、社交裂变与计算机病毒防护等领域拥有广泛的映射:
6.1 动力学系统的相变阈值
从指数模型到 SIS 模型,我们清晰地看到了参数微变引起的 系统质变(Bifurcation):当 $R_0 = \frac{\lambda}{\mu} \le 1$ 时,零点是全局渐近稳定的吸引子(疾病必灭);而一旦 $R_0 > 1$,系统就会发生跨临界分岔,收敛到非零的持久流行稳态。这一相变思想同样适用于互联网产品的病毒式增长(K-Factor > 1 爆发,< 1 衰亡)。
6.2 防控措施的微观数学映射
所有现代公共卫生干预手段,都可以精准映射到微分方程的参数调节上:
- 物理隔离、戴口罩、保持社交距离 $\to$ 降低单位时间有效接触率 $\lambda$;
- 特效药物研发、重症医疗支持 $\to$ 缩短病程、提高康复率 $\mu$;
- 核心目标始终如一:在相平面上将有效传染数强行压制到 1 的临界线以下。
6.3 从简单常微分到复杂网络拓扑
经典的 ODE 模型假设人群是“完全均匀混合”的,而在真实世界中,人类社会是由无标度网络(Scale-Free Network)构成的。极少数拥有超高连接度的“超级传播者”能够在网络中造成不成比例的巨大冲击。这也为我们下一篇探讨具有免疫机制的 SIR 经典模型奠定了关键基石。