为 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_ivp
与method="RK45"
结合使用,这在自动化方面与odeint
大体相似。注意 ODE 函数需要 t
作为第一个参数。
RK45
本身就是一个步进器class,你必须自己实现主时间循环,这有时会提供更大的灵活性。
有关 Radau 步进器的更长示例,请参阅 。
我查看了 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_ivp
与method="RK45"
结合使用,这在自动化方面与odeint
大体相似。注意 ODE 函数需要 t
作为第一个参数。
RK45
本身就是一个步进器class,你必须自己实现主时间循环,这有时会提供更大的灵活性。
有关 Radau 步进器的更长示例,请参阅