编辑:此问题是由于在Scipy 0.15中修复的错误
在我开发和测试代码时,我可能会犯一个简单的错误,比如NameError。当我使用scipy.integrate.odeint时,odeint会打印出错误消息,但是在我请求的时间段内保持集成,所以我得到了许多相同的错误消息。我认为它具有这种行为,因此它可以在算术错误发生时继续(例如,除以零),但这对编程错误没有帮助。
有没有办法让scipy在第一条错误消息后停止?如果我可以让它停止错误而不是算术异常,那将是最好的。
答案 0 :(得分:2)
odeint
是C代码的Python包装器,它调用LSODA(一个Fortran子例程),它调用C代码来调用代表dy / dt的Python回调。 LSODA没有传递Python异常,从一个C代码跳转到另一个代码很难实现。
我使用ode
代替odeint
找到了一个令人满意的解决方案。我发现ode
开始使用时更复杂,但是当Python中抛出异常时,它的行为方式正确。下面的fake_odeint()
函数是开始创建一个与odeint
类似的函数,以便我的目的,以便我可以在现有代码中交换它。使用ode
而不是odeint
的缺点是每个时间步长调用一次LSODA;此调用在odeint
的C中发生,在ode
中在Python中发生得更慢。
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进行通信的机制。