条件达到后,Runge Kutta终止

问题描述

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)/6k1,k2,k3,k4, 在yt之间的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)