在第一次错误时停止scipy odeint

时间:2013-05-07 15:17:32

标签: python scipy odeint

编辑:此问题是由于在Scipy 0.15中修复的错误

在我开发和测试代码时,我可能会犯一个简单的错误,比如NameError。当我使用scipy.integrate.odeint时,odeint会打印出错误消息,但是在我请求的时间段内保持集成,所以我得到了许多相同的错误消息。我认为它具有这种行为,因此它可以在算术错误发生时继续(例如,除以零),但这对编程错误没有帮助。

有没有办法让scipy在第一条错误消息后停止?如果我可以让它停止错误而不是算术异常,那将是最好的。

1 个答案:

答案 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代码允许odeintthis SO question中的LSODA进行通信的机制。