问题描述
Matlab ODE解算器中显示的弹跳球示例提供了一种在偶数触发(https://www.mathworks.com/help/matlab/math/ode-event-location.html)时终止积分的方法。在此示例中,它在高度为0时终止。您还可以在斜率从正变为负(球飞行的顶点)或从负变为正(当球撞击地板时)终止。
是否可以在Math.Net RungeKutta.FourthOrder()中实现这种触发?
此外,除了测试和类参考之外,还有更好的文档吗?那里的信息非常薄https://numerics.mathdotnet.com/api/MathNet.Numerics.OdeSolvers/RungeKutta.htm#FourthOrder。
感谢您的帮助!
解决方法
主要思想是检查每个集成步骤,当前段中是否有根。为了便于使用该解的插值多项式,所谓的dense output
。将其插入到事件函数中,然后对该复合函数使用普通的寻根过程,通常从对间隔进行采样以查找符号变化开始,然后通过带有括号间隔的某种方法完善根。
对于RK4,存在一个根据级的值构造的三次插值多项式。这样可以得到中等质量的结果,不仅要好于割线,而且还不能达到阶跃误差的全部4或5阶。
使用步进计算中的dy=(k1+2*k2+2*k3+k4)/6
和k1,k2,k3,k4
,
在y
和t
之间的t0
处的插值t1=t0+h
为
s = (t-t0)/h
y = y0+s*(3*(1-s)**2+s**2)*dy + s*(1-s)/2*(k1-2*(1-2*s)*(k2+k3)-k4)