Python scipy.integrate.ode.set\u solout有效吗?

Python scipy.integrate.ode.set\u solout有效吗?,python,scipy,ode,Python,Scipy,Ode,集成例程的scipy.integrate.ode接口提供了一种方法,用于在任何步骤set\u 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:

集成例程的
scipy.integrate.ode
接口提供了一种方法,用于在任何步骤
set\u 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)
将numpy导入为np
从scipy.integrate导入ode
定义f(t,y):
“”“指数衰减。”“”
返回-y
def solout(t,y):
如果y[0]<0.5:
返回-1
其他:
返回0
y_初始值=1
t_初始值=0
r=ode(f)。设置支持solout的积分器(“dopri5”)
r、 设置初始值(y初始值、t初始值)
r、 设置(solout)
#积分到t=5,但在违反solout约束时停止
r、 整合(5)
#solout应终止集成的时间:
交叉口时间=np.log(2)
t=log(2)=0.693…
时,solout应该停止集成,但相反,当
y=0.007
时,它会愉快地继续集成,直到
t=5


这是
scipy
中的错误,还是我没有正确使用
set\u solout

结果是,在调用
set\u initial\u value
之前,您需要调用
set\u solout
。(我通过研究
scipy
测试套件中的调用找到了答案。)因此,颠倒问题代码中两个调用的顺序可以得到正确的结果

即使这种行为是正确的,也应该在
set\u solout
的文档中提及。我已经发帖了

更新:此问题已在SciPy 0.17.0中修复
set\u solout
即使在
set\u initial\u value
之后调用,也会起作用,问题代码将产生正确的结果