我有一个常微分方程dy/dt = f(y,t)
,其中y是一个N维向量,我想用scipy.integrate.solve_ivp
函数来求解。
然而,在一些情况下,如果某个 predicate g(y,t)
的计算结果为True,我希望停止积分。这里的用例是,我希望y
的值在积分持续时间t_end
结束之前收敛到某个常量值y0
。我对这个常数值y0
感兴趣,并且希望通过一旦收敛就终止积分来保存时间。
我希望我可以创建一个数组来存储最后5个积分步骤中y
的值,如果它们非常接近,则认为已经发生了收敛。solve_ivp
的event
函数在我的例子中没有什么帮助:没有我希望找到的根,而且我对收敛发生时的t
不感兴趣。我很惊讶,这种寻找收敛的看似“常见”的用例并不容易完成,而且我在Stackoverflow上也找不到类似的问题。
如果有人有什么想法,我很乐意听听。
1条答案
按热度按时间sg24os4d1#
这是访问
solve_ivp
在后台使用的积分器类的一个很好的候选对象。如果我们采用初始条件为y(0) = 100
的简单函数dy/dt = -y
。我们希望在模拟的1秒内解的变化小于0.1时终止函数,即abs(y(t) - y(t-1)) < 0.1
。对于这个常微分方程,这种情况发生在t=-ln(0.1 / (100(e-1))
或t~7.45
。我们可以使用RK45积分器(RK45 docs)来解决这个问题,如下所示:收益率