编辑:此问题是由于在Scipy 0.15中修复的错误
在我开发和测试代码时,我可能会犯一个简单的错误,比如NameError.当我使用scipy.integrate.odeint时,odeint会打印出错误消息,但是在我请求的时间段内保持集成,所以我得到了许多相同的错误消息.我认为它具有这种行为,因此它可以在算术错误发生时继续(例如,除以零),但这对于编程错误是无益的行为.
有没有办法让scipy在第一条错误消息后停止?如果我可以让它停止错误而不是算术异常,那将是最好的.
最佳答案 odeint是C代码的
Python包装器,它调用LSODA(一个Fortran子例程),它调用C代码来调用代表dy / dt的Python回调. 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进行通信的机制.