scipy.integrate.ode 与两个耦合的 ODE?

Posted

技术标签:

【中文标题】scipy.integrate.ode 与两个耦合的 ODE?【英文标题】:scipy.integrate.ode with two coupled ODEs? 【发布时间】:2011-08-09 03:08:57 【问题描述】:

我目前正在尝试使用 SciPy 的集成.ode 包来解决一对耦合的一阶 ODE:例如,Lotka-Volterra predator-prey equation。但是,这意味着在集成循环期间,我必须在每次迭代时更新发送给方法的参数,并且简单地跟踪先前的值并在每次迭代时调用 set_f_params() 似乎没有奏效.

hprev = Ho
pprev = Po
yh = np.zeros(0)
yp = np.zeros(0)
while dh.successful() and dp.successful() and dp.t < endtime and dh.t < endtime:
    hparams = [alpha, beta, pprev]
    pparams = [delta, gamma, hprev]
    dh.set_f_params(hparams)
    dp.set_f_params(pparams)
    dh.integrate(dh.t + stepsize)
    dp.integrate(dp.t + stepsize)
    yh = np.append(yh, dh.y)
    yp = np.append(yp, dp.y)
    hprev = dh.y
    pprev = dp.y

我在每次迭代中通过set_f_params 设置的值似乎不会传播到回调方法,这并不令人惊讶,因为网络上的示例似乎都没有涉及“实时”变量传递到回调,但这是我能想到的将这些值放入回调方法的唯一方法。

有人对如何使用 SciPy 对这些 ODE 进行数值积分有任何建议吗?

【问题讨论】:

【参考方案1】:

我可能是错的,但this example 似乎非常接近您的问题。 :) 它使用odeint 来求解 ODE 系统。

【讨论】:

该死的保罗,这个问题已经在这里坐了两个小时,你在我之前 28 秒发布了同一个链接:-) 不可思议! ...嗯,至少不太可能。 这正是我想要的!虽然我想我应该考虑将这两个变量组合成一个数组并将其作为 X 传递......哦,好吧,吸取了教训。非常感谢! 链接失效:新链接scipy.github.io/old-wiki/pages/Cookbook/LoktaVolterraTutorial【参考方案2】:

我遇到了类似的问题。事实证明,积分器不会为每次调用integrate() 重新评估微分方程函数,而是在它自己的内部时间进行。我将积分器的 max_step 选项更改为与 stepsize 相同,这对我有用。

【讨论】:

以上是关于scipy.integrate.ode 与两个耦合的 ODE?的主要内容,如果未能解决你的问题,请参考以下文章

将 numba.jit 与 scipy.integrate.ode 一起使用

scipy.integrate.odeint 和 scipy.integrate.ode 有啥区别?

scipy.integrate.ode 放弃集成

scipy.integrate.ode 的内部工作

通过 scipy.integrate.ode 使用自适应步长

如何找到 scipy.integrate.ode 的默认 atol 和 rtol?