🧮 Чисельні методи · Фізика
📅 Березень 2026 ⏱ ≈ 10 хв читання 🔵 Середній · Останнє оновлення: 23 червня 2026 р.

Розв'язувачі ЗДР: порівняння методів Ейлера, RK4 і Leapfrog

Кожна фізична симуляція — падаючі яблука, планети на орбітах, молекули, що відскакують — потайки розв'язує диференціальне рівняння в кожному кадрі. Вибір методу визначає, чи буде ваша симуляція стійкою та енергозберігаючою, чи повільно зануриться в хаос.

1. Що таке ЗДР?

Звичайне диференціальне рівняння (ЗДР) виражає швидкість зміни стану як функцію самого стану. Другий закон Ньютона — це класичний приклад:

Другий закон Ньютона як система ЗДР dv/dt = F(x, v, t) / m (швидкість змінюється через силу)
dx/dt = v (положення змінюється через швидкість)

Маючи початкові умови x(0) та v(0), розв'язувач ЗДР просуває систему малими часовими кроками Δt, наближаючи точний розв'язок. Похибка на крок і довгострокова поведінка значною мірою залежать від алгоритму.

2. Метод Ейлера

Найпростіша можлива схема: беремо похідну в поточній точці й робимо крок у цьому напрямку на Δt.

Прямий (явний) метод Ейлера x(t + Δt) = x(t) + Δt · ẋ(t)
v(t + Δt) = v(t) + Δt · a(t)
Уникайте Ейлера для довгих симуляцій: планета, що рухається орбітою з інтегруванням Ейлера, повільно віддаляється по спіралі від Сонця — не тому, що фізика неправильна, а тому, що інтегратор неконсервативний.

3. Методи середньої точки та Гойна

Просте вдосконалення: обчислюємо похідну в проміжній точці. Метод Гойна (предиктор–коректор):

Метод Гойна (RK2) k1 = f(t, y)
k2 = f(t + Δt, y + Δt·k1) (передбачена кінцева точка)
y(t + Δt) = y + (Δt/2)·(k1 + k2)

Обидва — 2-го порядку — набагато точніші за Ейлера лише за подвійної вартості. Усе ще несимплектичні; енергія все одно дрейфує на дуже довгих прогонах.

4. Рунге–Кутта 4-го порядку (RK4)

Робоча конячка наукових обчислень. RK4 обчислює чотири оцінки похідної на крок і бере їхнє зважене середнє:

Оновлення RK4 k1 = f(t, y)
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)
Емпіричне правило: RK4 ідеальний для розрахунків траєкторій з відомим часом завершення (маневри ракет, анімації на основі ЗДР). Для необмежено довгих симуляцій (молекулярна динаміка, довгострокова орбітальна механіка) натомість використовуйте Leapfrog чи інші симплектичні розв'язувачі.

5. Інтегрування Leapfrog / Верле

Інтегратор Leapfrog (Штермера–Верле) зміщує положення та швидкість на пів часового кроку — положення і швидкості «перестрибують» одне одного:

Leapfrog (форма velocity Verlet) v(t + Δt/2) = v(t) + (Δt/2)·a(t)
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)
Чому leapfrog симплектичний? Він зберігає об'єм фазового простору (теорема Ліувілля). Це дискретний аналог рівнянь Гамільтона, які теж зберігають об'єм фазового простору.

6. Симплектичні проти несимплектичних

Симплектичний інтегратор точно зберігає трохи збурений гамільтоніан H' (близький до справжнього H). Це запобігає систематичному зростанню чи спаданню енергії, роблячи симуляцію стійкою як завгодно довгий час.

Несимплектичні методи (Ейлер, RK4) не задовольняють цю властивість. Їхні похибки енергії зростають необмежено, з часом руйнуючи довгі симуляції, навіть якщо похибка на крок є крихітною.

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. Який метод обрати?

Cannon-es і Rapier (фізичні рушії, що живлять цей сайт) використовують варіації симплектичного Ейлера та розв'язувачів на основі імпульсів. Вони жертвують певною точністю в обмін на надзвичайну стійкість і розв'язання зіткнень твердих тіл.

Дослідіть симуляції задачі N тіл і орбітальні симуляції на цьому сайті — вони використовують інтегрування Leapfrog, щоб планети стабільно рухалися орбітами мільйони змодельованих років без віддалення по спіралі.

🪐 Відкрити орбітальну симуляцію →