为 SIR 模型实施 scipy.integrate.RK45

Implementing scipy.integrate.RK45 for SIR model

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

我正在尝试为传染病实施 ODE,使用预定义参数 beta, f, gamma 和人口组的初始值(易感、暴露、传染、恢复)S0, E0, I0, R0 . (如果需要,我会 post 这些值,但我认为这些与我的问题无关。)

我知道如何实施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

欢迎提出任何建议。

solve_ivpmethod="RK45"结合使用,这在自动化方面与odeint大体相似。注意 ODE 函数需要 t 作为第一个参数。

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


有关 Radau 步进器的更长示例,请参阅