scipy.integrate.ode解决两个耦合的ODE?
我现在正在尝试使用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
来解决一组常微分方程。