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)