检查 scipy.solve_ivp() 中触发了哪个事件的快速方法是什么? 作为上下文,我正在模拟双摆。我想检查第一根杆或第二根杆是否已翻转。我为每个事件创建了两个事件函数,但是一旦触发事件,有什么方法可以检索已触发的事件吗?谢谢:)
如果将多个事件传递给
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
返回值类似。