首页 > 解决方案 > 使用solve_ivp的“事件”检查收敛

问题描述

问题:

假设一个简单的衰减过程,如以下 ode 所述:

def exponential_decay(t,y):
    return -0.5 * y

这可以在 scipy 的solve_ivp()的帮助下轻松集成

t_min = 0; t_max = 25; y0 = 1
sol = solve_ivp(exponential_decay, [t_min, t_max],[y0],dense_output=True)

生成的解决方案可能如下所示:

在此处输入图像描述

问题:

我想使用solve_ivp的“事件”查找器来检查收敛,以减少达到收敛后所花费的计算时间。但是,当提供事件函数时,事件跟踪器的设计签名是:

event(t,y) -> t_event

当事件函数的返回值为零时发生事件。

因为event(t,y)只知道当前的 y(t),所以它不能直接用于实现标准收敛标准,因为它们都需要一系列 y。

所以简而言之:有没有一种好方法可以做到这一点,使用事件查找器来检查收敛?
或者在收敛跟踪器中使用任何类型的 y(t) 范围?这似乎对许多应用程序都有帮助

我发现这样做的一个(坏方法)是将一个全局变量传入和传出事件(t,y),该变量存储不同的(t,y(t)。然而,这不仅非常不雅,而且抵消了solive_ivp()提供的计算效率

标签: pythoneventsscipyode

解决方案


推荐阅读