检查solve_ivp中的事件

问题描述 投票:0回答:1

检查 scipy.solve_ivp() 中触发了哪个事件的快速方法是什么? 作为上下文,我正在模拟双摆。我想检查第一根杆或第二根杆是否已翻转。我为每个事件创建了两个事件函数,但是一旦触发事件,有什么方法可以检索已触发的事件吗?谢谢:)

python scipy simulation numerical-methods
1个回答
0
投票

如果将多个事件传递给

solve_ivp
,则返回值
sol.t_events
sol.y_events
通过将不同的事件放在不同的数组中来指示发生了哪种事件。

这是一个示例,我已改编自 SciPy 文档。我正在模拟大炮发射,我想知道炮弹何时达到顶峰以及炮弹何时落地。

from scipy.integrate import solve_ivp


def upward_cannon(t, y):
    return [y[1], -0.5]

def hit_ground(t, y):
    return y[0]

def peak(t, y):
    return y[1]


hit_ground.terminal = True
hit_ground.direction = -1


events = [peak, hit_ground]
sol = solve_ivp(upward_cannon, [0, 101], [0, 10], events=events)
print(sol.t_events)

输出:

[array([20.]), array([40.])]

这里,

events
中的第一个元素是
peak()
。因此,
sol.t_events
的第一个元素是发生该事件的 t 值数组。该值是
array([20.])
,因此它仅在 t = 20 时发生一次。第二个数组对应于第二组事件。

sol.y_events
返回值类似。

© www.soinside.com 2019 - 2024. All rights reserved.