在scipy.integrate.odeint中处理KeyboardInterrupt

时间:2012-05-14 03:13:01

标签: python exception-handling scipy numerical-integration

在调用scipy.integrate.odeint时,是否有合理的方法来处理导数评估中的异常?

如果在紧密循环中调用积分器,则此问题变得很重要,并且由于某种原因需要停止执行。目前,我已经将KeyboardInterrupt转换为SystemExit例外(见下文)以使流程退出,这很好,但显然不理想。

scipy.integrate绑定和Fortran代码似乎正在对odepack.error进行一些操作,但我不确定这些异常是否会传播到Python中。

from scipy.integrate import odeint
import numpy
import sys
import time

def derivative_faststop(func):
    def impl(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except KeyboardInterrupt:
            print sys.exc_info()
            sys.exit(1)
    return impl

@derivative_faststop
def f(x, t):
    # NB. the sleep is only present to model the real system
    time.sleep(0.5)
    return [1.0]

ts = numpy.linspace(0.00, 1.0, 11)
print odeint(f, [0.0], ts)

0 个答案:

没有答案