Рабочий процесс симуляции

Универсальный конвейер: от физического закона до проверенной симуляции.

Рабочий процесс вычислительной физики — это цепочка: закон → уравнение → дискретизация → симуляция → проверка. Пропуск последнего звена превращает красивый код в генератор правдоподобной чепухи.

Пять шагов одного исследования

Любая симуляция, от падающего мяча до галактики, проходит один и тот же путь. Разберём его на примере пружинного маятника.

1. Физический закон

Берём принцип. Для механики это второй закон Ньютона: F = m·a. Для пружины сила возвращающая: F = -k·x (тянет к положению равновесия, знак минус).

2. Уравнение движения

Подставляем силу и получаем дифференциальное уравнение: m·a = -k·x, то есть ускорение a = -(k/m)·x. Это и есть уравнение, описывающее, как система меняется во времени.

3. Дискретизация

Превращаем уравнение в пошаговый рецепт. Ускорение известно из текущей координаты, скорость обновляем по ускорению, координату — по скорости. На каждом шаге dt:

a = -(k/m)·x
v = v + a·dt
x = x + v·dt

4. Симуляция

Запускаем цикл и собираем траекторию. Здесь мы используем хороший интегратор (скоростной Верле — про него позже) и сразу считаем полную энергию:

import math
k, m = 4.0, 1.0
x, v = 1.0, 0.0
dt = 0.01
w = math.sqrt(k/m)
print(f"Пружина: k={k}, m={m}, ω=√(k/m)={w:.3f}, период T=2π/ω={2*math.pi/w:.3f} c")
print(" t      x        v       E=½mv²+½kx²")
t = 0.0
for step in range(0, 315):
    if step % 50 == 0:
        E = 0.5*m*v*v + 0.5*k*x*x
        print(f"{t:4.2f}  {x:+.4f}  {v:+.4f}    {E:.4f}")
    a = -k*x/m
    x += v*dt + 0.5*a*dt*dt
    a2 = -k*x/m
    v += 0.5*(a+a2)*dt
    t += dt
print("Полная энергия E постоянна — Верле её сохраняет.")

Вывод:

Пружина: k=4.0, m=1.0, ω=√(k/m)=2.000, период T=2π/ω=3.142 c
 t      x        v       E=½mv²+½kx²
0.00  +1.0000  +0.0000    2.0000
0.50  +0.5403  -1.6829    1.9999
1.00  -0.4162  -1.8185    1.9998
1.50  -0.9900  -0.2821    2.0000
2.00  -0.6536  +1.5136    1.9999
2.50  +0.2837  +1.9177    1.9998
3.00  +0.9602  +0.5586    2.0000
Полная энергия E постоянна — Верле её сохраняет.

5. Проверка

Самый важный шаг — и самый часто пропускаемый. Откуда мы знаем, что симуляция права? Проверяем тремя способами:

  • Законы сохранения. У пружины нет трения, значит полная энергия E обязана быть постоянной. В выводе она держится около 2.0000 — отлично.
  • Предельные случаи. Период малых колебаний должен равняться 2π/ω. Формула даёт 3.142 c, и через ~3.14 c координата возвращается к +1 — сходится.
  • Сравнение с аналитикой. Для гармонического осциллятора есть точное решение x(t)=cos(ωt); численная кривая ему следует.

Как работает под капотом

Сердце процесса — интегратор, правило обновления состояния за шаг dt. От его выбора зависит, сохранится ли энергия. Плохой интегратор (простой Эйлер) на той же задаче медленно «накачивает» энергию, и симуляция через сотни шагов становится ложью, хотя код не содержит ни одной опечатки. Поэтому проверка сохранения — не формальность, а детектор скрытых ошибок метода.

Частые ошибки

  • Пропустить шаг 5. Без проверки нельзя отличить верную симуляцию от красивой ошибки.
  • Неверные единицы. Если g в м/с², а расстояние в километрах — числа будут бессмысленны. Следите за размерностями.
  • Менять сразу несколько параметров. При отладке меняйте по одному, иначе непонятно, что повлияло на результат.

Итоги

  • Конвейер: закон → уравнение → дискретизация → симуляция → проверка.
  • Дискретизация превращает дифференциальное уравнение в пошаговый рецепт.
  • Проверка по сохранению энергии, пределам и аналитике обязательна.
  • Выбор интегратора решает, останется ли симуляция физически верной.
Проверьте себя
1. Какой шаг рабочего процесса чаще всего пропускают, и зря?
AЗапись физического закона
BДискретизацию
CПроверку результата по сохранению и пределам
DВыбор языка программирования
2. Почему сохранение энергии — хороший тест симуляции механики без трения?
AЭнергия в природе всегда растёт
BВ системе без трения полная энергия обязана быть постоянной, и её дрейф выдаёт ошибку метода
CЭнергию проще всего вывести на экран
DЭто требование языка Python
3. Что превращает дифференциальное уравнение в пошаговый рецепт?
AИнтегрирование по частям
BДискретизация: замена производных конечными разностями на шаге dt
CПеревод в другую систему единиц
DОкругление коэффициентов