Полёт с сопротивлением воздуха
Когда нет формулы: полёт с сопротивлением воздуха решается только численно.
Квадратичное сопротивление — сила трения о воздух, пропорциональная квадрату скорости и направленная против движения; с ней уравнение движения теряет аналитическое решение.
Почему здесь нужна симуляция
Идеальный бросок решается формулой. Но реальный мяч, парашютист или снаряд испытывают сопротивление воздуха. Сила трения растёт с квадратом скорости и направлена назад: F_drag = -k·|v|·v (вектор скорости, умноженный на её модуль). Из-за этого квадрата уравнение становится нелинейным — точной формулы для траектории больше нет. Остаётся единственный путь: считать численно.
Это типичная ситуация в физике: стоит добавить трение, переменную массу или зависимость силы от скорости — и аналитика капитулирует, а симуляция продолжает работать без изменений в подходе.
Сила сопротивления векторно
Трение тормозит вдоль направления движения. Если скорость (vx, vy), а её модуль v=√(vx²+vy²), то компоненты силы (на единицу массы): ax_drag = -k·v·vx, ay_drag = -k·v·vy. К вертикали добавляется ещё -g. Сравним бросок с сопротивлением и без него:
import math
g, v0 = 9.8, 30.0
ang = 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
k = 0.02
while y >= 0:
speed = math.hypot(vx, vy)
ax = -k*speed*vx
ay = -g - k*speed*vy
vx += ax*dt; vy += ay*dt
x += vx*dt; y += vy*dt
t += dt
print(f"С сопротивлением: дальность ≈ {x:5.1f} м, время {t:.2f} c")
R = v0*v0*math.sin(2*ang)/g
T = 2*v0*math.sin(ang)/g
print(f"Без сопротивления (формула): дальность {R:5.1f} м, время {T:.2f} c")Вывод:
С сопротивлением: дальность ≈ 41.3 м, время 3.35 c Без сопротивления (формула): дальность 91.8 м, время 4.33 c
Сопротивление съело больше половины дальности (41 м против 92 м) и укоротило полёт. Траектория теперь несимметрична: нисходящая ветвь круче восходящей, потому что на спуске скорость, а с ней и торможение, меньше. Никакая школьная формула этого не даст.
Предельная скорость
Симуляция показывает ещё один эффект — предельную (терминальную) скорость. При падении тело разгоняется, пока сопротивление не уравновесит тяжесть: k·v² = g. После этого ускорение нулевое, скорость постоянна. Парашютист падает с постоянной скоростью именно поэтому. Это предельный случай, по которому удобно проверять симуляцию: при долгом падении вертикальная скорость должна выйти на v_term = √(g/k).
Как работает под капотом
Под капотом не изменилось почти ничего: тот же цикл «сила → ускорение → скорость → координата». Добавился лишь один член в ускорение. В этом сила численного подхода — усложнение физики (нелинейная сила) не усложняет алгоритм. Аналитику новый член ломает полностью, симуляцию — нисколько. Поэтому в инженерии (баллистика, аэродинамика, спуск аппаратов) почти всё считают численно.
Частые ошибки
- Брать силу пропорциональной v, а не v·|v|. Для быстрых тел сопротивление квадратично; линейная модель годится лишь для очень медленного движения (закон Стокса).
- Забыть, что трение векторно. Оно тормозит обе компоненты скорости, а не только вертикальную.
- Слишком крупный шаг при больших скоростях. Резкое торможение требует мелкого dt, иначе скорость «перелетает» через ноль и осциллирует.
Итоги
- Квадратичное сопротивление делает уравнение нелинейным — аналитики нет.
- Сила трения векторна:
-k·|v|·v, тормозит вдоль скорости. - Сопротивление резко укорачивает полёт и делает траекторию несимметричной.
- Предельная скорость
√(g/k)— удобный тест симуляции.