Scipy solve_ivp 事件

问题描述

我尝试在 scipy.integrate.solve_ivp 函数中使用事件,但不明白一件事。 从 docs(https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html) 中的示例我知道当 y 位置低于 0 时我可以停止积分。当我想跟踪符号的变化时它起作用。但例如,当我的射弹的 y 位置高于 3000 m 时,我想停止集成。我尝试在 hit_ground 函数添加“if 条件”,但它不起作用。

def hit_ground(t,y):
if y[1] > 3000:
    return y[1]

我尝试从 y0 = [0,500,radians(45)] 开始积分,其中 500 是速度,45 是角度

这是我尝试使用此更改运行代码后得到的错误

TypeError: '

如果没有此更改,它可以正常工作。

解决方法

“事件”由事件函数为 0 定义。在您的情况下,您希望事件在高度为 3000 时发生。炮弹示例中的高度为 y[0](不是 {{1 }} 与您的代码一样),因此您希望事件在 y[1] 为 3000 时发生,或等效地,当 y[0] 为 0 时发生。试试这个:

y[0] - 3000