Рабочий процесс симуляции
Универсальный конвейер: от физического закона до проверенной симуляции.
Рабочий процесс вычислительной физики — это цепочка: закон → уравнение → дискретизация → симуляция → проверка. Пропуск последнего звена превращает красивый код в генератор правдоподобной чепухи.
Пять шагов одного исследования
Любая симуляция, от падающего мяча до галактики, проходит один и тот же путь. Разберём его на примере пружинного маятника.
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в м/с², а расстояние в километрах — числа будут бессмысленны. Следите за размерностями. - Менять сразу несколько параметров. При отладке меняйте по одному, иначе непонятно, что повлияло на результат.
Итоги
- Конвейер: закон → уравнение → дискретизация → симуляция → проверка.
- Дискретизация превращает дифференциальное уравнение в пошаговый рецепт.
- Проверка по сохранению энергии, пределам и аналитике обязательна.
- Выбор интегратора решает, останется ли симуляция физически верной.