Розв'язувачі ЗДР: порівняння методів Ейлера, RK4 і Leapfrog
Кожна фізична симуляція — падаючі яблука, планети на орбітах, молекули, що відскакують — потайки розв'язує диференціальне рівняння в кожному кадрі. Вибір методу визначає, чи буде ваша симуляція стійкою та енергозберігаючою, чи повільно зануриться в хаос.
1. Що таке ЗДР?
Звичайне диференціальне рівняння (ЗДР) виражає швидкість зміни стану як функцію самого стану. Другий закон Ньютона — це класичний приклад:
dx/dt = v (положення змінюється через швидкість)
Маючи початкові умови x(0) та v(0), розв'язувач ЗДР
просуває систему малими часовими кроками Δt, наближаючи
точний розв'язок. Похибка на крок і довгострокова поведінка значною мірою
залежать від алгоритму.
2. Метод Ейлера
Найпростіша можлива схема: беремо похідну в поточній точці й робимо
крок у цьому напрямку на Δt.
v(t + Δt) = v(t) + Δt · a(t)
- Порядок: 1-й порядок (похибка ∝ Δt на крок, ∝ Δt² глобально).
- Вартість: 1 обчислення сили на крок — дуже дешево.
- Проблема: метод штучно додає енергію консервативним системам. Орбіти розкручуються назовні; пружини коливаються зі зростаючою амплітудою. Похибка накопичується навіть за крихітного Δt.
3. Методи середньої точки та Гойна
Просте вдосконалення: обчислюємо похідну в проміжній точці. Метод Гойна (предиктор–коректор):
k2 = f(t + Δt, y + Δt·k1) (передбачена кінцева точка)
y(t + Δt) = y + (Δt/2)·(k1 + k2)
Обидва — 2-го порядку — набагато точніші за Ейлера лише за подвійної вартості. Усе ще несимплектичні; енергія все одно дрейфує на дуже довгих прогонах.
4. Рунге–Кутта 4-го порядку (RK4)
Робоча конячка наукових обчислень. RK4 обчислює чотири оцінки похідної на крок і бере їхнє зважене середнє:
k2 = f(t + Δt/2, y + (Δt/2)·k1)
k3 = f(t + Δt/2, y + (Δt/2)·k2)
k4 = f(t + Δt, y + Δt·k3)
y(t + Δt) = y + (Δt/6)·(k1 + 2k2 + 2k3 + k4)
- Порядок: 4-й — глобальна похибка ∝ Δt⁴. Надзвичайно точний для гладких задач.
- Вартість: 4 обчислення сили на крок — у 4 рази більше, ніж Ейлер.
- Проблема: також несимплектичний. За мільйони кроків енергія дрейфує — повільніше, ніж в Ейлера, але все одно дрейфує.
5. Інтегрування Leapfrog / Верле
Інтегратор Leapfrog (Штермера–Верле) зміщує положення та швидкість на пів часового кроку — положення і швидкості «перестрибують» одне одного:
x(t + Δt) = x(t) + Δt · v(t + Δt/2)
a(t + Δt) = F(x(t + Δt)) / m (повторне обчислення сили)
v(t + Δt) = v(t + Δt/2) + (Δt/2)·a(t + Δt)
- Порядок: 2-й порядок — такий самий, як у Гойна, але вдвічі дешевший (1 обчислення сили на крок).
- Симплектичний: так — повна енергія коливається навколо правильного значення, але не дрейфує. Орбіти залишаються замкненими завжди за будь-якого фіксованого Δt.
- Використовується в: усіх основних пакетах молекулярної динаміки (LAMMPS, GROMACS), кодах для задачі N тіл, небесній механіці.
6. Симплектичні проти несимплектичних
Симплектичний інтегратор точно зберігає трохи збурений гамільтоніан H' (близький до справжнього H). Це запобігає систематичному зростанню чи спаданню енергії, роблячи симуляцію стійкою як завгодно довгий час.
Несимплектичні методи (Ейлер, RK4) не задовольняють цю властивість. Їхні похибки енергії зростають необмежено, з часом руйнуючи довгі симуляції, навіть якщо похибка на крок є крихітною.
- Leapfrog/Верле — симплектичний 2-го порядку
- Метод Рута 3-го порядку — симплектичний 3-го порядку
- Йосіда 4-го порядку — симплектичний 4-го порядку (поєднує 3 під-кроки leapfrog)
- PEFRL — сучасний 4-го порядку, якому часто віддають перевагу в симуляціях МД
7. Таблиця порівняння
| Метод | Порядок | Обчислень/крок | Симплектичний | Енергія довгостроково | Найкраще для |
|---|---|---|---|---|---|
| Ейлер (прямий) | 1-й | 1 | Ні | Зростає | Лише демо, навчання |
| Симплектичний Ейлер | 1-й | 1 | Так | Стабільна | Швидкі ігри, багато частинок |
| Середня точка / Гойн | 2-й | 2 | Ні | Повільний дрейф | Короткі анімації |
| RK4 | 4-й | 4 | Ні | Дуже повільний дрейф | Точні траєкторії |
| Leapfrog / Верле | 2-й | 1 | Так | Коливається ≈ const | Орбітальна, молекулярна динаміка |
| Йосіда 4-го | 4-й | 3 | Так | Коливається ≈ const | Високоточні довгі прогони |
8. Реалізація на JavaScript
Усі три інтегратори для простого гармонічного осцилятора
a = −ω²·x (пружина без згасання):
const omega = 1.0; // кутова частота
const dt = 0.05; // часовий крок (секунди)
function accel(x) { return -omega * omega * x; }
// ── Прямий метод Ейлера ───────────────────────────────────
function stepEuler(x, v) {
const a = accel(x);
return { x: x + dt * v, v: v + dt * a };
}
// ── RK4 ────────────────────────────────────────────
function stepRK4(x, v) {
const k1x = v, k1v = accel(x);
const k2x = v + 0.5*dt*k1v, k2v = accel(x + 0.5*dt*k1x);
const k3x = v + 0.5*dt*k2v, k3v = accel(x + 0.5*dt*k2x);
const k4x = v + dt*k3v, k4v = accel(x + dt*k3x);
return {
x: x + (dt/6) * (k1x + 2*k2x + 2*k3x + k4x),
v: v + (dt/6) * (k1v + 2*k2v + 2*k3v + k4v)
};
}
// ── Leapfrog (Velocity Verlet) ─────────────────────
function stepLeapfrog(x, v) {
const vHalf = v + 0.5 * dt * accel(x); // швидкість на пів-кроці
const xNew = x + dt * vHalf; // положення на повному кроці
const vNew = vHalf + 0.5 * dt * accel(xNew); // швидкість на пів-кроці знову
return { x: xNew, v: vNew };
}
// Енергія гармонічного осцилятора (має зберігатися)
function energy(x, v) { return 0.5*v*v + 0.5*omega*omega*x*x; }
energy(x, v) у часі. Ви побачите, що енергія Ейлера зростає
лінійно, енергія RK4 зростає дуже повільно, а енергія Leapfrog щільно коливається навколо
початкового значення.
9. Який метод обрати?
- Ігри / фізика в реальному часі: симплектичний Ейлер (спершу оновлюємо швидкість, потім положення). Одне обчислення, симплектичний, дешевий.
- Задача N тіл / молекулярна динаміка: Leapfrog/Верле. Стандарт у галузі вже 50 років.
- Точна коротка траєкторія (ракета, снаряд): RK4. Точність важливіша за довгострокову стійкість.
- Високоточна астрономія на довгих прогонах: Йосіда 4-го порядку або симплектичний вищого порядку.
- Жорсткі рівняння (хімічна кінетика, схеми): неявні методи (обернений Ейлер, SDIRK) — це окрема тема.
Дослідіть симуляції задачі N тіл і орбітальні симуляції на цьому сайті — вони використовують інтегрування Leapfrog, щоб планети стабільно рухалися орбітами мільйони змодельованих років без віддалення по спіралі.