Свободное падение и баллистика
Двумерное движение под тяжестью: численный бросок и сверка с параболой.
Баллистическое движение без сопротивления — суперпозиция равномерного движения по горизонтали и равноускоренного по вертикали; его траектория — парабола.
Раскладываем на две оси
Брошенное тело движется сразу в двух направлениях. По горизонтали силы нет — скорость vx постоянна. По вертикали действует тяжесть — vy убывает на g·dt каждый шаг. Оси независимы, и это ключевая идея: двумерную задачу мы решаем как две одномерные, бок о бок.
Начальная скорость v0 под углом α раскладывается так: vx = v0·cos(α), vy = v0·sin(α). Дальше — обычный цикл по времени для каждой оси.
Аналитические ориентиры
Для броска без сопротивления есть формулы, по которым проверяют симуляцию: дальность R = v0²·sin(2α)/g (максимум при 45°), время полёта T = 2·v0·sin(α)/g, высота подъёма H = v0²·sin²(α)/(2g). Симуляция обязана их воспроизвести.
Численный бросок
Бросаем тело со скоростью 30 м/с под 45°, печатаем траекторию по точкам и сверяем дальность с формулой:
import math
g, v0, ang = 9.8, 30.0, math.radians(45)
vx, vy = v0*math.cos(ang), v0*math.sin(ang)
x, y, t, dt = 0.0, 0.0, 0.0, 0.01
print(" t x y")
next_print = 0.0
while y >= 0:
if t >= next_print - 1e-9:
print(f"{t:4.1f} {x:6.2f} {y:6.2f}")
next_print += 0.5
vy += -g*dt
x += vx*dt
y += vy*dt
t += dt
R = v0*v0*math.sin(2*ang)/g
T = 2*v0*math.sin(ang)/g
print(f"Симуляция: дальность ≈ {x:.1f} м, время ≈ {t:.2f} c")
print(f"Формулы: дальность = {R:.1f} м, время = {T:.2f} c")Вывод:
t x y 0.0 0.00 0.00 0.5 10.61 9.36 1.0 21.21 16.26 1.5 31.82 20.72 2.0 42.43 22.73 2.5 53.03 22.29 3.0 63.64 19.39 3.5 74.25 14.05 4.0 84.85 6.26 Симуляция: дальность ≈ 91.6 м, время ≈ 4.32 c Формулы: дальность = 91.8 м, время = 4.33 c
Симуляция (91.6 м) почти точно совпала с формулой (91.8 м); крошечная разница — обычная ошибка дискретизации простого метода. Высота поднимается и опускается почти зеркально: подъём занимает примерно столько же, сколько спуск.
Как работает под капотом
Под капотом нет «параболы» — есть два независимых счётчика скорости. Парабола возникает сама, как результат того, что одна координата растёт линейно, а другая — квадратично. Это глубокая мысль вычислительной физики: сложная форма траектории не закладывается, а рождается из простых локальных правил. Так же позже из правил притяжения родится эллипс орбиты, а из правил столкновений — распределение скоростей газа.
Частые ошибки
- Применять тяжесть к горизонтали. По оси x ускорения нет; добавив его, получите кривую вместо прямой.
- Останавливать цикл по числу шагов, а не по условию
y >= 0. Тогда тело «улетит под землю» или симуляция оборвётся рано. - Забыть про градусы и радианы. В Python тригонометрия работает с радианами; угол в градусах нужно перевести.
Итоги
- Двумерный бросок — две независимые одномерные задачи по осям x и y.
- По горизонтали скорость постоянна, по вертикали убывает на g·dt.
- Симуляция воспроизводит формулы дальности и времени полёта.
- Парабола не закладывается, а рождается из локальных правил движения.