Gaffer on Games имеет отличную статью об использовании интеграции RK4 для лучшей физики игры. Реализация прост, но математика за ней меня смущает. Я понимаю производные и интегралы на концептуальном уровне, но долгое время не манипулировал уравнениями.
Здесь главная задача Gaffer:
void integrate(State &state, float t, float dt)
{
Derivative a = evaluate(state, t, 0.0f, Derivative());
Derivative b = evaluate(state, t+dt*0.5f, dt*0.5f, a);
Derivative c = evaluate(state, t+dt*0.5f, dt*0.5f, b);
Derivative d = evaluate(state, t+dt, dt, c);
const float dxdt = 1.0f/6.0f * (a.dx + 2.0f*(b.dx + c.dx) + d.dx);
const float dvdt = 1.0f/6.0f * (a.dv + 2.0f*(b.dv + c.dv) + d.dv)
state.x = state.x + dxdt * dt;
state.v = state.v + dvdt * dt;
}
Может кто-нибудь объяснить простыми словами, как работает RK4? В частности, почему мы усредняем производные от 0.0f
, 0.5f
, 0.5f
и 1.0f?
. Как усреднение производных до 4-го порядка отличается от простого интегрирования эйлеров с меньшим временным временем?
После прочтения принятого ниже ответа и нескольких других статей, я понимаю, как работает RK4. Чтобы ответить на мои вопросы:
Может кто-нибудь объяснить простыми словами, как работает RK4?
RK4 использует тот факт, что мы можем получить гораздо лучшее приближение функции, если мы используем ее производные более высокого порядка, а не просто первая или вторая производная. Вот почему серия Тейлорасходится намного быстрее, чем Эйлер приближения. (взгляните на анимация с правой стороны страница)
В частности, почему мы усредняем производные от 0.0f
, 0.5f
, 0.5f
и 1.0f
?
Метод Рунге-Кутты является аппроксимация функции, которая образцы производных нескольких точек в течение времени, в отличие от Тейлора серия, в которой производятся только производные одной точки. После отбора проб эти производные нам нужно знать, как для взвешивания каждого образца, чтобы получить возможно ближайшее приближение. простой способ сделать это - выбрать константы, совпадающие с Серии Тейлора, константы уравнения Рунге-Кутты определяются.
В этой статье стало понятнее меня. Обратите внимание, что
(15)
- это Тейлор в то время как(17)
является Рунге-Кутта.
Как усредняют производные до 4-го порядка, отличные от простого интегрирования эйлеров с меньшим значением времени?
Математически он сходится много быстрее, чем многие Эйлеры приближения. Конечно, с достаточным количеством Эйлера мы можем получить равные точность до RK4, но вычислительная необходимая мощность не оправдывает использование Эйлер.