Рунге Кутта прекращается при достижении состояния

Пример прыгающего мяча, показанный в решателе 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.

Любая помощь приветствуется!


person Scott    schedule 20.09.2020    source источник


Ответы (1)


Основная идея состоит в том, чтобы на каждом шаге интеграции проверять наличие корня в текущем сегменте. Для облегчения этого используется интерполирующий полином для решения, так называемый 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) 
person Lutz Lehmann    schedule 20.09.2020