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
的一个bug吗?还是我没有正确使用 set_solout
?