Python实现带接种人群的SIRD模型代码异常求助
带接种人群的SIRD模型异常排查思路
1. 核对微分方程的合理性
先确认你推导的带接种(V)的SIRD方程是否符合基本传播逻辑,标准的带接种SIRD方程框架如下:
dS/dt = -βSI/N - νS (易感人群减少:被感染+接种)
dI/dt = βSI/N - γI - μI (感染人群变化:新增感染 - 康复 - 死亡)
dR/dt = γI (康复人群仅来自感染人群康复)
dD/dt = μI (死亡人群仅来自感染人群死亡)
dV/dt = νS (接种人群来自易感人群接种)
需要重点确认:
- 接种项
dV/dt的来源是否是易感人群S,且系数ν(接种率)不为0 - 所有人群的总和
S+I+R+D+V是否在模拟过程中保持恒定(这是模型的核心守恒性,可通过打印每一步的总和验证)
2. 手动数值积分的逻辑错误
因为你没有用odeint而是手动实现积分(比如欧拉法、龙格-库塔法),这类实现最容易出问题:
- 时间步长问题:如果步长过大,会导致数值不稳定,甚至出现负人群数,或者曲线提前进入平台期
- 变量更新顺序错误:必须先计算所有变量的微分增量,再统一更新变量值,不能用更新后的变量去计算其他增量。比如错误写法:
# 错误:先更新S,再用新S计算V的增量 S += (-β*S*I/N - ν*S)*dt V += ν*S*dt
正确写法应该是先缓存所有当前值的微分,再统一更新:
# 正确:先计算所有微分 dS = (-β*S*I/N - ν*S) dV = ν*S dI = β*S*I/N - γ*I - μ*I dR = γ*I dD = μ*I # 再统一更新所有变量 S += dS*dt V += dV*dt I += dI*dt R += dR*dt D += dD*dt
3. 参数与初始条件排查
- 接种率ν:如果ν设为0或极小值(比如1e-5),接种人群V的增长会极其缓慢,视觉上呈现无增长状态
- 传播/康复/死亡参数:如果感染率β太小,或康复率γ+死亡率μ太大,感染人群I会快速清零,导致dR/dt和dD/dt变为0,R和D自然停止增长
- 初始条件:确认初始易感人群S₀是否大于0(如果S₀=0,V就没有增长来源);初始感染人群I₀是否足够支撑疫情传播(如果I₀=0,整个模型不会启动)
4. 代码细节检查
- 确认人群总数N的定义:N应该是初始状态下
S+I+R+D+V的总和,且模拟过程中每一步的总和应基本恒定(允许微小数值误差) - 检查是否有阈值判断逻辑:比如当I小于某个极小值时,强制将所有微分设为0,导致R、D提前停止增长
- 核对绘图代码:确认V的数组长度与时间轴一致,且没有被错误赋值为固定值(比如V始终等于初始值)
内容的提问来源于stack exchange,提问作者arthika
相关产品推荐
相关产品推荐

