scipy.integrate.ode.set_solout 有效吗?

Posted

技术标签:

【中文标题】scipy.integrate.ode.set_solout 有效吗?【英文标题】:Does scipy.integrate.ode.set_solout work? 【发布时间】:2014-12-31 13:14:15 【问题描述】:

集成例程的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】:

事实证明,您需要在调用set_initial_value之前调用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 之后调用也会起作用,并且问题代码将产生正确的结果。

【讨论】:

以上是关于scipy.integrate.ode.set_solout 有效吗?的主要内容,如果未能解决你的问题,请参考以下文章