Довідник · Фізика · Чисельні методи · Рідини
📅 Липень 2026 ⏱ ≈ 14 хв читання 🔄 Оновлено: липень 2026

Порівняння методів симуляції — інтегратори, моделі рідин і Монте-Карло

«Симуляція» охоплює цілу родину чисельних методів із дуже різними компромісами між точністю, стійкістю та вартістю обчислень. Цей довідник порівнює покрокові інтегратори (Ейлер, Верле, RK4, неявні методи), два фундаментальні способи моделювання суцільних середовищ (лагранжевий проти ейлерового) і стохастичні методи Монте-Карло — щоб ви могли обрати правильний інструмент замість того, щоб бездумно копіювати те, що використав останній туторіал.

1. Таблиця порівняння інтеграторів

Інтегратор — це частина коду, яка просуває позицію та швидкість на крок часу dt. Усі відмінності нижче зводяться до трьох властивостей: порядку точності (наскільки швидко зменшується локальна похибка зі зменшенням dt), поведінки енергії (чи набуває симуляція енергію, чи втрачає її протягом довгого прогону) та вартості (кількість обчислень сили на крок).

Метод Порядок Обчислень/крок Поведінка енергії Стійкість Типове застосування
Явний Ейлер 1-й 1 Набуває енергію (розходиться) Погана Лише навчання
Напівнеявний ЕйлерІгри 1-й 1 Обмежені коливання Добра (симплектична) Ігрова фізика, частинки
Верле (позиційний) 2-й 1 Обмежені коливання Добра (симплектична) Тканина, канати, N тіл
Швидкісний Верле 2-й 1–2 Обмежені коливання Добра (симплектична) Молекулярна динаміка
RK4Точний 4-й 4 Повільний вікових дрейф Несимплектичний Орбіти, хаос (Лоренц)
Неявний Ейлер 1-й 1 (розв'язок) Втрачає енергію (демпфований) Безумовно стійкий Жорстка тканина/м'яке тіло
Leapfrog (стрибок жаби) 2-й 1 Обмежені коливання Добра (симплектична) N тіл / астрофізика

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

2. Явний Ейлер

Найпростіший можливий інтегратор: обчислити похідну у поточному стані, а потім зробити крок вперед, використовуючи цю одну оцінку нахилу.

v(t+dt) = v(t) + a(t)·dt x(t+dt) = x(t) + v(t)·dt
// Явний (прямий) Ейлер — НЕ використовуйте для будь-чого коливального
function stepEuler(body, dt) {
  const a = body.force.scale(body.invMass);
  body.pos = body.pos.add(body.vel.scale(dt)); // використовує СТАРУ швидкість
  body.vel = body.vel.add(a.scale(dt));
}

Оскільки позиція використовує швидкість до застосування сили, явний Ейлер систематично додає енергію до будь-якої коливальної системи (пружини, орбіти, маятники). Пружина без тертя, симульована явним Ейлером, буде помітно розкручуватися назовні й зрештою «вибухне», незалежно від того, наскільки малим зроблено dt — похибка лише зменшується, але якісно не зникає. Цей метод наведено тут суто як базовий рівень, який покращують усі інші.

3. Напівнеявний (симплектичний) Ейлер

Виправлення в один рядок: спочатку оновити швидкість, а потім використати нову швидкість для оновлення позиції. Та сама вартість, що й у явного Ейлера, але значно краща поведінка енергії.

v(t+dt) = v(t) + a(t)·dt x(t+dt) = x(t) + v(t+dt)·dt ← використовує НОВУ швидкість
function stepSemiImplicit(body, dt) {
  const a = body.force.scale(body.invMass);
  body.vel = body.vel.add(a.scale(dt));      // спочатку швидкість
  body.pos = body.pos.add(body.vel.scale(dt)); // потім позиція, з новою v
}
Чому ігри використовують це всюди: метод є симплектичним — енергія коливається навколо істинного значення замість того, щоб дрейфувати геть. Він також надзвичайно дешевий (одне обчислення сили) і простий у реалізації, тому майже кожен фізичний рушій реального часу (Box2D, Cannon-es, типовий Rapier) використовує напівнеявний Ейлер як базовий інтегратор, зазвичай у поєднанні з підкроками для додаткової точності.

4. Верле та швидкісний Верле

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

x(t+dt) = 2·x(t) − x(t−dt) + a(t)·dt² (неявна швидкість ≈ (x(t+dt) − x(t−dt)) / (2·dt))
function stepVerlet(p, dt) {
  const a = p.force.scale(p.invMass);
  const next = p.pos
    .scale(2)
    .sub(p.prevPos)
    .add(a.scale(dt * dt));
  p.prevPos = p.pos;
  p.pos = next;
}

Швидкісний Верле зберігає явну швидкість, даючи ту саму точність другого порядку, але з придатною для використання v(t) для демпфування, опору чи сил, залежних від швидкості:

x(t+dt) = x(t) + v(t)·dt + ½·a(t)·dt² v(t+dt) = v(t) + ½·(a(t) + a(t+dt))·dt ← потребує ДРУГОГО обчислення сили
Чому солвери тканини надають перевагу позиційному Верле: обмеження (фіксована довжина канату, обмеження відстані між частинками тканини) можна застосовувати, безпосередньо переміщуючи позиції після кроку інтегрування, без потреби торкатися вектора швидкості. Ця комбінація «інтегрування Верле + релаксація обмежень» (популяризована статтею Томаса Якобсена 2001 року) досі є стандартною технікою для тканини й м'яких канатів у реальному часі.

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

RK4 обчислює похідну чотири рази за крок — на початку, двічі в середині та один раз наприкінці — і комбінує їх у зважене середнє. Це метод четвертого порядку точності: зменшення dt вдвічі зменшує локальну похибку приблизно у 16 разів, порівняно з 4 разами для Верле та 2 разами для Ейлера.

k1 = f(t, y) k2 = f(t + dt/2, y + dt/2·k1) k3 = f(t + dt/2, y + dt/2·k2) k4 = f(t + dt, y + dt·k3) y(t+dt) = y(t) + dt/6·(k1 + 2·k2 + 2·k3 + k4)
function rk4Step(state, dt, derivative) {
  const k1 = derivative(state);
  const k2 = derivative(addScaled(state, k1, dt / 2));
  const k3 = derivative(addScaled(state, k2, dt / 2));
  const k4 = derivative(addScaled(state, k3, dt));
  return addScaled(
    state,
    combine(k1, k2, k3, k4), // k1 + 2k2 + 2k3 + k4
    dt / 6
  );
}

Симуляції цього сайту Атрактор Лоренца та Подвійний маятник використовують RK4, бо хаотичні системи експоненційно посилюють малі числові похибки — похибка інтегратора низького порядку призводить до візуально неправильних траєкторій уже за кілька секунд. Недолік RK4: він не є симплектичним, тому орбітальні симуляції з RK4 повільно набирають або втрачають енергію протягом тисяч орбіт (для N-тіл, які мають працювати нескінченно довго, натомість використовуйте Leapfrog чи Верле).

6. Неявний Ейлер і жорсткі системи

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

v(t+dt) = v(t) + a(t+dt)·dt ← a залежить від невідомої v(t+dt) x(t+dt) = x(t) + v(t+dt)·dt

Ця додаткова робота дає безумовну стійкість: навіть з дуже великим dt неявний інтегратор не «вибухне» — він просто гасить високочастотний рух, що зазвичай є перевагою. Ця властивість найбільш важлива для жорстких систем, де сили змінюються за дуже різними часовими масштабами (наприклад, дуже натягнута пружина тканини поруч із розхлябаною). Стаття Барафа та Віткіна 1998 року «Large Steps in Cloth Simulation» популяризувала неявне інтегрування для тканини саме тому, що явні методи потребували неприпустимо малих кроків часу для збереження стійкості на жорстких пружинах.

Position Based Dynamics (PBD) та XPBD повністю обходять формулювання через силу/швидкість: вони безпосередньо розв'язують обмеження позицій щокадру (у стилі Гаусса-Зейделя, подібно до солвера послідовних імпульсів, описаного в «Побудова фізичного рушія з нуля»). PBD жертвує частиною фізичної точності заради гарантованої стійкості за будь-якого кроку часу, тому саме він нині лежить в основі більшості солверів тканини й м'яких тіл у реальному часі в іграх (NVIDIA Flex, система тканини Unity).

7. Лагранжева vs ейлерова симуляція рідини

Окрім інтеграторів окремих частинок, суцільні середовища (рідини, дим, ерозія рельєфу) можна моделювати з двох протилежних точок зору.

Лагранжевий підхід: стежити за матеріалом

Представити рідину як набір рухомих частинок, кожна з яких несе масу, швидкість і густину. Smoothed Particle Hydrodynamics (SPH), що використовується у симуляції цього сайту SPH-рідина, є класичним прикладом: властивості кожної частинки обчислюються шляхом згладжування (зважування ядром) за сусідніми частинками.

ρᵢ = Σⱼ mⱼ · W(rᵢ − rⱼ, h) (густина від сусідів) Pᵢ = k · (ρᵢ − ρ₀) (рівняння стану) Fᵢ = −Σⱼ mⱼ·(Pᵢ+Pⱼ)/(2ρⱼ)·∇W(rᵢ−rⱼ,h) (сила тиску)

SPH природно зберігає масу (частинки Є масою), обробляє вільні поверхні та бризки без додаткового обліку, а його вартість масштабується з кількістю частинок, а не з розміром порожнього простору. Недолік — пошук сусідів O(N·k) на кожному кроці та шумніші поверхні при малій кількості частинок.

Ейлерів підхід: зафіксувати сітку, дозволити матеріалу текти крізь неї

Дискретизувати простір у фіксовану сітку та зберігати швидкість/густину/тиск у кожній комірці, розв'язуючи рівняння Нав'є-Стокса методом скінченних різниць. Метод «Stable Fluids» Йоса Стама (напівлагранжева адвекція + проєкція тиску) є стандартною технікою реального часу:

∂v/∂t + (v·∇)v = −∇p/ρ + ν∇²v + f (імпульс) ∇·v = 0 (нестисливість)

Сіткові методи дають гладкі поля без артефактів і чудово підходять для диму, газів і патернів реакції-дифузії (див. Реакція-дифузія на цьому сайті, яка використовує фіксовану сітку з пінг-понг GPU текстурою). Їхня слабкість — вартість, прив'язана до роздільної здатності: сітка 256×256 витрачає однакові обчислення на порожнє повітря та на цікаву зону рідини — а також втрата дрібних деталей (маленьких крапель, тонких плівок) менших за розмір однієї комірки.

Властивість Лагранжевий (SPH) Ейлерів (сітка)
Збереження маси Точне (частинки = маса) Приблизне (похибка адвекції)
Вільні поверхні / бризки Природно Потребує відстеження рівня/об'єму
Гладкі поля (дим, газ) Шумно при малій кількості Гладко за побудовою
Масштабування вартості O(N частинок) O(комірок), незалежно від вмісту
Типова GPU-техніка Просторовий хеш / сітка сусідів Пінг-понг FBO / compute-шейдер
Гібрид FLIP/PIC та MPM (Material Point Method) поєднують обидва підходи: частинки несуть стан, фонова сітка розв'язує тиск — використовується в сучасних VFX-симуляціях рідин і снігу (наприклад, солвер снігу з мультфільму «Крижане серце»).

8. Методи Монте-Карло

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

Похибка ∝ 1/√N (N = кількість вибірок) → щоб зменшити похибку вдвічі, потрібно ПОЧЕТВЕРИТИ кількість вибірок, незалежно від розмірності задачі

Ця швидкість збіжності 1/√N є водночас найбільшою силою та найбільшою слабкістю Монте-Карло: вона однакова, скільки б вимірів не мала задача, тому Монте-Карло перевершує сіткову квадратуру для інтегралів високої розмірності (трасування шляхів світла, ціноутворення фінансових опціонів), але сходиться повільніше за гарний детермінований метод при низькій розмірності.

Детермінований проти стохастичного — окрема вісь порівняно з вибором інтегратора вище: можна поєднувати вибірку Монте-Карло (наприклад, для початкового розміщення частинок чи стохастичних поривів вітру) з будь-яким детермінованим інтегратором (Верле, RK4) для самого покрокового просування часу. Ці два підходи не є взаємовиключними.

9. Як обрати метод

Правило великого пальця: якщо демо працює нормально перші 10 секунд, але помітно набирає енергію чи «вибухає» через хвилину — ви майже напевно використовуєте несимплектичний інтегратор (явний Ейлер чи RK4) для системи, яка має використовувати симплектичний (напівнеявний Ейлер, Верле чи Leapfrog).