首页 > 解决方案 > 为 SIR 模型实现 scipy.integrate.RK45

问题描述

我查看了 的文档scipy.integrate.RK45,但找不到好的示例。

我正在尝试为传染病实施 ODE,beta, f, gamma并为人群 (Susceptible, Exposed, Infectious, Recovered) 预先定义参数和初始值S0, E0, I0, R0。(如果需要,我会发布这些值,但我认为这些与我的问题无关。)

我知道如何实施scipy.integrate.odeint

def SIR_model(y, t, f, beta, gamma):
    S, E, I, R = y
    dS = -beta*S*I 
    dE = beta*S*I - f*E 
    dI = f*E - gamma*I 
    dR = gamma*I
    return [dS, dE, dI, dR]

sol = scipy.integrate.odeint(SIR_model, [S0,E0,I0,R0], t, args=(f, beta,gamma))



做这项工作。我现在的目标是使用该RK45方法。我意识到这种方法需要以不同的方式实现,但是当我尝试以下操作时出现错误:

scipy.integrate.RK45(fun=SIR_model, t0 = t[0], y0 = [S0,E0,I0,R0],t_bound=t[-1])

# raised TypeError: SIR_model() missing 3 required positional arguments: 'f', 'beta', and 'gamma'
scipy.integrate.RK45(fun=SIR_model(y,t,f,beta,gamma), t0 = t[0], y0 = [S0,E0,I0,R0],t_bound=t[-1])

# raised TypeError: cannot unpack non-iterable NoneType object
y0 = [S0,E0,I0,R0]
scipy.integrate.RK45(fun=SIR_model(y0,t,f,beta,gamma), t0 = t[0], y0 = [S0,E0,I0,R0],t_bound=t[-1])

# raised TypeError: 'list' object is not callable

欢迎大家提出意见。

标签: pythonscipynumerical-methodsodenumerical-integration

解决方案


使用solve_ivpwith method="RK45",这在自动化方面非常相似odeint。注意 ODE 函数需要t作为第一个参数。

RK45本身是一个步进类,您必须自己实现主时间循环,这有时会提供更大的灵活性。


请参阅无法导入 X 问题。Oregonator 模型的 Stiff ODE 求解器,用于Radau 步进器的更长示例。


推荐阅读