集成例程的scipy.integrate.ode
接口提供了一种在任何步骤set_solout
违反约束时停止集成的方法。但是,即使在最简单的示例中,我也无法使用此方法。这是一次尝试:
import numpy as np
from scipy.integrate import ode
def f(t, y):
"""Exponential decay."""
return -y
def solout(t, y):
if y[0] < 0.5:
return -1
else:
return 0
y_initial = 1
t_initial = 0
r = ode(f).set_integrator('dopri5') # Integrator that supports solout
r.set_initial_value(y_initial, t_initial)
r.set_solout(solout)
# Integrate until t = 5, but stop when solout constraint violated
r.integrate(5)
# The time when solout should have terminated integration:
intersection_time = np.log(2)
t = log(2) = 0.693...
时,应该通过solout停止集成,但在t = 5
时,y = 0.007
一直持续到scipy
。
这是set_solout
中的错误,还是我没有正确使用{{1}}?
答案 0 :(得分:8)
事实证明,您需要在调用set_solout
之前致电set_initial_value
。 (我通过研究scipy
测试套件中的set_solout
tests来解决这个问题。)因此,在我的问题代码中反转两个调用的顺序会产生正确的结果。
即使这种行为是正确的,也应该在set_solout
的文档中提及。我已发布an issue with SciPy on GitHub。
更新:此问题已在SciPy 0.17.0中修复; set_solout
即使在set_initial_value
之后调用也会有效,问题代码会生成正确的结果。