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

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

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

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

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

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

Берём принцип. Для механики это второй закон Ньютона: $F = ma$. Для пружины сила возвращающая: $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\pi/\omega$. Формула даёт 3.142 c, и через ~3.14 c координата возвращается к +1 — сходится.
  • Сравнение с аналитикой. Для гармонического осциллятора есть точное решение $x(t) = \cos(\omega t)$; численная кривая ему следует.

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

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

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

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

Итоги

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