Свободное падение и баллистика

Двумерное движение под тяжестью: численный бросок и сверка с параболой.

Баллистическое движение без сопротивления — суперпозиция равномерного движения по горизонтали и равноускоренного по вертикали; его траектория — парабола.

Раскладываем на две оси

Брошенное тело движется сразу в двух направлениях. По горизонтали силы нет — скорость 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.
  • Симуляция воспроизводит формулы дальности и времени полёта.
  • Парабола не закладывается, а рождается из локальных правил движения.
Проверьте себя
1. Как ведёт себя горизонтальная скорость vx при броске без сопротивления?
AУбывает на g·dt каждый шаг
BОстаётся постоянной
CРастёт со временем
DМеняет знак в верхней точке
2. Почему траектория получается параболой, хотя в коде нет формулы параболы?
AТак задано в библиотеке math
Bx растёт линейно, а y — квадратично; парабола возникает сама из локальных правил
CИз-за округления чисел
DЭто случайное совпадение
3. При каком угле дальность броска максимальна (без сопротивления)?
A30°
B45°
C60°
D90°