我不确定事件处理是否scipy.integrate.solve_ivp工作正常。在下面的例子中,我对一个导数进行积分,得到一个三次多项式,它的根在x=-6,x=-2和x=2。我设置了一个事件函数,返回y,在x值处为零。我希望在解决方案的t_events属性中看到三个条目,但是我只看到一个条目,尽管很明显解决方案跨越x轴三次。在
我是不是做错了什么?在
复制代码示例:def fprime(x, y):
return 3 * x**2 + 12 * x - 4
def event(x, y):
return y
import numpy as np
from scipy.integrate import solve_ivp
sol = solve_ivp(fprime, (-8, 4), np.array([-120]), t_eval=np.linspace(-8, 4, 10), events=[event])
上述代码导致:
^{pr2}$
```
问题是从sol.y数组中可以看到应该有三个0(有三个符号改变),但是只记录了一个事件。在
Scipy/Numpy/Python版本信息:1.0.0 1.13.3 sys.version_info(major=3, minor=6, micro=0, releaselevel='final', serial=0)
[UPDATE]:如果我使用可选的max_step参数来求解_ivp,并使其足够小,那么我会看到所有三个根。似乎事件函数并不是在t帴eval步骤中调用的,而是仅在内部解算器步骤上调用,后者远远少于t帴eval步骤,并且最终会跳过某些根。这似乎不是很有用,因为你必须知道如何设置最大步长以避免丢失根。在