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

SEIQR传染病模型Python实现行为异常问题排查与修正求助

SEIQR传染病模型Python实现行为异常问题排查与修正求助

各位好!我正在做微分方程课程的项目,需要把一个现有的SEIQR传染病传播模型用Python实现出来。我找到了一套带有真实参数的模型,但自己写的代码运行后,结果完全不对——最离谱的是,有些种群的曲线数值居然超过了总人口数,这显然违反了基本逻辑。我现在完全摸不着头脑,不知道是方程写错了、参数设错了,还是有其他问题,也不确定能不能在不破坏模型动力学特性的前提下,把数值限制在合理范围内。

下面是我的代码,麻烦大家帮忙看看哪里出问题了:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

def seiqr_model(y, t, vinv, beta1, beta2, sigma1, sigma2, sigma3, r, d1, d2, alpha, eta1, eta3):
    S, E, I, R, Q = y
    dSdt = vinv - d1*S - alpha*vinv/d1 * E
    dEdt = ((alpha*vinv - d1 *eta1)/d1) * E
    dIdt = r*E - eta3*I
    dRdt = sigma3*E + sigma2*I - d1*R + sigma1*Q
    dQdt = beta1*E + beta2*I - eta3*Q
    return [dSdt, dEdt, dIdt, dRdt, dQdt]

# 初始条件
S0 = 34218169
E0 = 10000
I0 = 157
R0 = 0
Q0 = 0
y0 = [S0, E0, I0, R0, Q0,]

# 参数设置
vinv = 2300
beta1 = 0.15
beta2 = 0.00001
sigma1 = 0.00001
sigma2 = 0.00001
sigma3 = 0.001
r = 0.00325
d1 = 0.00003
d2 = 0.0000003423
alpha = 0.00000000264
eta1 = r+beta1+sigma3+d1
eta3 = sigma1+d1+d2

t = np.linspace(0, 75, 75)
sol = odeint(seiqr_model, y0, t, args=(vinv, beta1, beta2, sigma1, sigma2, sigma3, r, d1, d2, alpha, eta1, eta3))

plt.plot(t, sol[:,0], label='S')
plt.plot(t, sol[:,1], label='E')
plt.plot(t, sol[:,2], label='I')
plt.plot(t, sol[:,3], label='R')
plt.plot(t, sol[:,4], label='Q')
plt.xlabel('Time')
plt.ylabel('Proportion')
plt.legend()
plt.show()

我现在的几个疑问:

  • 是不是微分方程的推导有错误?比如各种群的变化率公式哪里写错了,导致数值溢出?
  • 如果要让所有种群数值不超过总人口,有没有办法在不改变模型核心动力学的前提下实现?
  • 参数的设置是不是有问题?比如某些参数的量级或者取值逻辑不对,导致模型行为异常?

真心希望懂传染病模型或者微分方程数值求解的朋友能帮我分析一下,谢谢大家!

备注:内容来源于stack exchange,提问作者Ali Ismail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:08:13