python - 为 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
欢迎大家提出意见。
解决方案
使用solve_ivp
with method="RK45"
,这在自动化方面非常相似odeint
。注意 ODE 函数需要t
作为第一个参数。
RK45
本身是一个步进类,您必须自己实现主时间循环,这有时会提供更大的灵活性。
请参阅无法导入 X 问题。Oregonator 模型的 Stiff ODE 求解器,用于Radau 步进器的更长示例。
推荐阅读
- excel - 如果单元格包含“,”,如何复制行并将其插入到下面的新行中,并删除原始单元格中“,”之后的内容
- javascript - 如何保持循环运行并发送所有消息?
- c - 代码未能给出预期结果,堆叠循环
- python-2.7 - 如何在html表格中显示python dict
- ios - 在 Safari 和 IOS 中使用“Gifs”:视频不会自动播放
- python - 将数据从 Python 插入 SQL Server
- sql-server - SQL:从选择中排除某些条件
- python - 在 powershell 中处理 python 3 unicode 输出 - 可以干净地完成吗?
- java - 如何使素数测试接受大数
- lua - 如何在lua中向零舍入