python – 在第一个错误时停止scipy odeint

编辑:此问题是由于在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进行通信的机制.

点赞