python - scipy.integrate.ode.set_solout 有效吗?

标签 python scipy ode

集成例程的 scipy.integrate.ode 接口(interface)提供了一种在任何步骤违反约束时停止集成的方法,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

最佳答案

事实证明,您需要先调用 set_solout 调用 set_initial_value。 (我通过研究 scipy 测试套件中的 set_solout tests 弄明白了这一点。)因此,颠倒我的问题代码中两个调用的顺序会产生正确的结果。

即使这种行为是正确的,也应该在 set_solout 的文档中提及。我已经发布了 an issue with SciPy on GitHub .

更新:此问题已在 SciPy 0.17.0 中修复;即使在 set_initial_value 之后调用,set_solout 也会起作用,问题代码会产生正确的结果。

关于python - scipy.integrate.ode.set_solout 有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26738676/

相关文章:

python - 如何在 Python 中创建命名空间包?

python - 使用 Selenium 和 Python 查找具有特定文本的元素

python - 计算 Matrix 中的邻居数 - Conway Game of Life

python - 获取 SciPy 分位数以匹配 Stata xtile 函数

python - 在 Python 中有效地按键选择字典项目

python - 访问 Scipy ode 求解器的内部步骤

python - 二阶颂歌系统的庞加莱截面

python - Flask - 将变量添加到另一个路由的响应中?

python - 如果 url 太大,urllib 会卡住!

python - Scipy、odeint 以及 odeint 输入函数的输入设置