Стаття Фізика та механіка · ≈ ⏱ 10 хв читання

Симплектичність Leapfrog: доведення — і чому це обмежує похибку енергії назавжди

Слово «симплектичний» часто вживають у статтях про фізичні рушії, рідко доводячи. Тут ми покроково виводимо, чому відображення Leapfrog / Штормера-Верле точно зберігає симплектичну 2-форму (величину, яка вимірює орієнтовану площу у фазовому просторі і не змінюється при точній гамільтоновій динаміці) — і що це дає: жодного систематичного дрейфу енергії, навіть через мільярд кроків.

Коротко: Leapfrog (Штормера-Верле) можна розкласти на під-кроки Drift-Kick-Drift, кожен з яких має якобіан з детермінантом рівно 1, тож їхня композиція точно зберігає площу фазового простору на кожному кроці. Саме тому похибка енергії Leapfrog залишається обмеженою й коливається, а не «повзе» в один бік, як у RK4 при довгих симуляціях.

1. Що означає «симплектичний»

Гамільтонова система еволюціонує у фазовому просторі (q, p) (координати, імпульси). Симплектична форма — це білінійна антисиметрична 2-форма ω = dq ∧ dp, яка вимірює орієнтовану площу в фазовому просторі. Потік φₜ точних рівнянь Гамільтона зберігає цю форму точно: φₜ* ω = ω для будь-якого t.

Симплектична умова (матрична форма) Jᵀ · Ω · J = Ω,    де Ω = [[0, I], [−I, 0]]

Тут J = ∂(q', p')/∂(q, p) — якобіан відображення одного кроку в фазовому просторі. Це узагальнення умови det J = 1 (збереження об'єму, теорема Ліувілля) — симплектичність строгіша: вона зберігає орієнтовану площу для кожної 2-площини, не лише повний об'єм.

Наслідок, який нас цікавить

Симплектичні інтегратори точно розв'язують «збурений гамільтоніан» H̃ = H + O(dtᵏ), близький до справжнього H. Тому похибка енергії обмежена й коливається навколо нуля, а не накопичується систематично, як в несимплектичних методах (Euler, RK4).

2. Leapfrog як композиція відображень

Розкладемо Leapfrog (DKD-форма) на три елементарні відображення фазового простору:

Drift-Kick-Drift як три відображення Φ_D(h/2): q → q + p·(h/2)/m,   p незмінне
Φ_K(h): p → p + F(q)·h,   q незмінне
Φ_D(h/2): q → q + p·(h/2)/m,   p незмінне

Leapfrog = Φ_D(h/2) ∘ Φ_K(h) ∘ Φ_D(h/2)

Ключова ідея доведення: кожне з трьох відображень окремо симплектичне, а композиція симплектичних відображень завжди симплектична (це випливає з ланцюгового правила для якобіанів: J_composite = J₁·J₂·J₃, і якщо кожне Jᵢᵀ·Ω·Jᵢ = Ω, то й добуток задовольняє те саме).

3. Обчислення якобіана Drift та Kick

Розглянемо 1D-систему (q, p) для простоти; узагальнення на багато вимірів — покомпонентне. Якобіан Drift-кроку:

Якобіан Drift J_D = [[∂q'/∂q, ∂q'/∂p], [∂p'/∂q, ∂p'/∂p]] = [[1, h/(2m)], [0, 1]]

Якобіан Kick-кроку (де сила F(q) залежить лише від позиції — типово для консервативних потенціалів):

Якобіан Kick J_K = [[1, 0], [h·F'(q), 1]]

Обидві матриці мають детермінант точно 1 — необхідна (але не достатня) умова симплектичності в 1D.

4. Доведення: кожне відображення зберігає ω

У 1D симплектична умова спрощується до det(J) = 1 (в одновимірному фазовому просторі 2×2 симплектична форма — це просто орієнтована площа). Перевіримо для Drift:

det(J_D) = 1 det [[1, h/(2m)], [0, 1]] = 1·1 − (h/(2m))·0 = 1 ✓

Аналогічно для Kick:

det(J_K) = 1 det [[1, 0], [h·F'(q), 1]] = 1·1 − 0·h·F'(q) = 1 ✓

Оскільки детермінант добутку матриць дорівнює добутку детермінантів:

Складений детермінант det(J_D · J_K · J_D) = det(J_D) · det(J_K) · det(J_D) = 1·1·1 = 1 ∎

Це доводить, що кожен крок Leapfrog зберігає орієнтовану площу фазового простору точно — незалежно від dt, від нелінійності сили F(q), і без жодного наближення. На відміну від Euler чи RK4, тут немає похибки, яка накопичується — умова виконується рівно, аналітично.

Узагальнення на багато вимірів

У багатовимірному фазовому просторі (N частинок, 6N вимірів) аргумент той самий, лише детермінант замінюється повною симплектичною умовою Jᵀ·Ω·J = Ω на блочно-діагональних матрицях J_D, J_K. Кожен блок — це та сама 2×2 структура для кожної координати, тому доведення масштабується без змін.

5. Аналіз зворотної похибки

Найглибший результат теорії симплектичних інтеграторів (Hairer, Lubich, Wanner) — backward error analysis: симплектичний метод точно розв'язує «збурений» гамільтоніан H̃ = H + h²·H₂ + h⁴·H₄ + … для деякої обчислюваної H₂, H₄, … Оскільки H̃ — це справжня консервативна система (сама симплектична), її енергія зберігається точно.

Межа похибки енергії (експоненційно довго, не назавжди) |H(t) − H(0)| = O(hᵖ),   для t ≤ exp(c/h)

«Назавжди» — це трохи перебільшення: похибка обмежена лише на експоненційно довгому проміжку часу (за теоремою KAM/backward-error), але для практичних симуляцій (мільйони — мільярди кроків N-тіл) це фактично невідрізнено від «завжди».

6. Чому RK4 не є симплектичним

RK4 обчислює зважене середнє чотирьох оцінок похідної в різних точках — це відображення фазового простору не факторизується у послідовність канонічних (симплектичних) перетворень. Якобіан RK4-кроку не задовольняє Jᵀ·Ω·J = Ω за жодного вибору dt (окрім тривіального dt → 0). Це можна перевірити прямим обчисленням якобіана для простого гармонічного осцилятора — det(J_RK4) ≠ 1 при скінченному h.

Як це виглядає на практиці

Симулюйте орбіту Кеплера з RK4 на мільйон кроків — енергія систематично «повзе» в один бік (найчастіше зростає), орбіта поступово розкручується назовні. З Leapfrog енергія коливається в межах O(h²) навколо істинного значення без систематичного дрейфу.

7. Порівняння наслідків

Властивість Leapfrog RK4
det(J) за крок Точно 1 ≠ 1 при скінченному h
Похибка енергії з часом Обмежені коливання Систематичний дрейф
Порядок точності O(h²) O(h⁴)
Обчислень сили/крок 1 4
Найкраще для Довгі N-тіл, MD Короткі, високоточні траєкторії

8. Псевдокод

Чисельна перевірка det(J) (JS)

// Чисельна перевірка det(J) = 1 для одного кроку Leapfrog
// на простому гармонічному осциляторі F(q) = −k·q
function leapfrogJacobianDeterminant(k, m, h) {
  // Drift: q' = q + p*(h/2)/m, p' = p
  const Jd = [[1, h / (2 * m)], [0, 1]];
  // Kick: p' = p + F(q)*h = p − k*q*h, q' = q  → F'(q) = −k
  const Jk = [[1, 0], [−k * h, 1]];

  matMul2 = (A, B) => [
    [A[0][0]*B[0][0] + A[0][1]*B[1][0], A[0][0]*B[0][1] + A[0][1]*B[1][1]],
    [A[1][0]*B[0][0] + A[1][1]*B[1][0], A[1][0]*B[0][1] + A[1][1]*B[1][1]]
  ];

  const J = matMul2(matMul2(Jd, Jk), Jd);
  const det = J[0][0]*J[1][1] − J[0][1]*J[1][0];
  return det; // завжди точно 1, для будь-яких k, m, h
}
▶ Демо наживо

Побачити довгострокову стабільність у дії

Симуляція N-тіл цього проєкту використовує Leapfrog саме заради цієї властивості — орбіти залишаються стабільними навіть після десятків тисяч кроків.

⭐ N-тіла 🔵 Молекулярна динаміка

🔗 Пов'язані симуляції

N-тіла 🔵Молек. динаміка ⚙️Маятник