odeint
是C代碼的Python包裝,它調用調用C代碼來調用我的Python回調代表dy/dt的LSODA(Fortran子例程)。 LSODA不會傳遞Python異常,並且從C代碼的一位跳到另一位很難實現。
我在使用ode
而不是odeint
找到了令人滿意的解決方案。我發現ode
開始使用起來比較複雜,但在Python中拋出異常時,它的行爲是正確的。下面的fake_odeint()
函數是一個開始於使我的目的足夠好的odeint
函數,以便我可以在我現有的代碼中進行交換。使用ode
而不是odeint
的缺點是LSODA每個時步調用一次;這個調用在C中使用odeint
,而在Python中使用ode
更慢。
import numpy as np
from scipy.integrate import ode
def fake_odeint(func, y0, t, Dfun=None):
ig = ode(func, Dfun)
ig.set_integrator('lsoda',
method='adams')
ig.set_initial_value(y0, t=0.)
y = []
for tt in t:
y.append(ig.integrate(tt))
return np.array(y)
我看着的的Fortran,C,和Python代碼如何被用來允許odeint
在this SO question與LSODA通信的機制。
此錯誤已被報告https://github.com/scipy/scipy/issues/2570 – astrojuanlu 2013-06-24 10:09:48
這在SciPy 0.15 https://github.com/scipy/scipy/pull/4052中已修復。 – Ben 2015-02-10 11:18:23