scipy.integrate.ode解决两个耦合的ODE?

6 投票
2 回答
9163 浏览
提问于 2025-04-16 16:04

我现在正在尝试使用SciPy的integrate.ode包来解决一对耦合的一阶常微分方程,比如说著名的洛特卡-沃尔泰拉捕食者-猎物方程。不过,这就意味着在每次计算的循环中,我需要更新我传给方法的参数,而仅仅跟踪上一个值并在每次迭代时调用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来数值积分这些常微分方程呢?

2 个回答

4

我之前也遇到过类似的问题。结果发现,积分器并不是每次调用integrate()的时候都重新计算微分方程,而是按照它自己内部的时间来计算。我把积分器的max_step选项改成和stepsize一样大,这样就解决了我的问题。

7

我可能说错了,但这个例子看起来和你的问题很相似。:) 它使用了odeint来解决一组常微分方程。

撰写回答