You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:30:09