Капстоун: прыгающий мяч и баланс энергии
Финальная сцена курса: мяч под гравитацией прыгает на полу, теряя энергию на каждом отскоке — и мы за всем этим следим числами.
Энергетический учёт в симуляции — отслеживание полной энергии для контроля физичности: между ударами она должна почти сохраняться, а на ударах падать ровно на величину потерь.
Что мы собираем вместе
Этот урок — синтез всего курса. Мы соберём симуляцию, где встречаются сразу несколько изученных идей: интегрирование движения под постоянной силой (гравитация), обнаружение события (касание пола), отскок с коэффициентом восстановления и непрерывный учёт энергии. Полная энергия мяча $E = \frac{m v^2}{2} + m g y$ должна вести себя предсказуемо: между отскоками — почти константа (свободный полёт энергию сохраняет), а в момент удара — резко падать, ведь часть энергии теряется ($E_k$ умножается на $e^2$).
Полная симуляция
g, m, e = 9.8, 1.0, 0.9 # гравитация, масса, восстановление
y, vy = 5.0, 0.0 # старт: высота 5 м, покой
dt = 0.01
bounces = 0
for step in range(0, 401):
if step % 50 == 0:
Ek = 0.5*m*vy*vy
Ep = m*g*max(y, 0)
print(f"t={step*dt:.2f} y={y:5.2f} vy={vy:+6.2f} "
f"E={Ek+Ep:6.3f} отскоков={bounces}")
vy -= g*dt # гравитация
y += vy*dt # шаг по высоте
if y < 0: # обнаружили удар о пол
y = -y # вернули мяч над полом
vy = -e*vy # отскок с потерей скорости
bounces += 1
print(f"всего отскоков за 4 с: {bounces}")
Вывод:
t=0.00 y= 5.00 vy= +0.00 E=49.000 отскоков=0 t=0.50 y= 3.75 vy= -4.90 E=48.760 отскоков=0 t=1.00 y= 0.05 vy= -9.80 E=48.520 отскоков=0 t=1.50 y= 3.21 vy= +4.11 E=39.913 отскоков=1 t=2.00 y= 4.02 vy= -0.79 E=39.673 отскоков=1 t=2.50 y= 2.37 vy= -5.69 E=39.433 отскоков=1 t=3.00 y= 1.28 vy= +6.37 E=32.778 отскоков=2 t=3.50 y= 3.21 vy= +1.47 E=32.538 отскоков=2 t=4.00 y= 2.70 vy= -3.43 E=32.297 отскоков=2 всего отскоков за 4 с: 2
Читаем результат как историю: первую секунду мяч свободно падает, и энергия держится у $49$ (медленное сползание — численный дрейф интегратора). На первом отскоке (между $t = 1.0$ и $t = 1.5$) энергия скачком падает с $\approx 48.5$ до $\approx 39.9$ — это потеря $\approx 18\%$, ровно $1 - e^2 = 1 - 0.81$, как и предсказывает коэффициент восстановления. Второй отскок снова срезает энергию до $\approx 32.8$. Между ударами линия энергии почти горизонтальна — свободный полёт её не трогает. Симуляция физически честна.
Энергия как дирижёр отладки
Заметьте, насколько информативен график энергии. По нему мы не глядя на анимацию восстанавливаем всю динамику: ступеньки вниз — это удары, их высота — потери на восстановление, а наклон между ступеньками выдаёт качество интегратора. Если бы между отскоками энергия росла — мы бы заподозрили несимплектичный метод; если бы падала на ударе слишком сильно или слабо — ошибку в формуле восстановления; если бы дёргалась случайно — баг в обнаружении касания. Энергия — единственное число, в котором сходятся все физические законы курса, и потому она — лучший дирижёр отладки физического движка.
Как работает под капотом
Обратите внимание на строку y = -y при ударе: мяч за шаг чуть провалился под пол, и мы «зеркалим» его обратно, заодно сохраняя пройденную глубину — простое и устойчивое разрешение проникновения. Более точные движки интерполировали бы точное время касания (как мы делали с дальностью снаряда), но для большинства задач хватает и зеркального возврата при малом $\Delta t$. Так в одной короткой программе соединились все опоры курса: дискретные шаги, силы, события, отскоки и сквозной контроль через энергию. Именно из таких кирпичиков собирается любой физический движок — от аркады до научного симулятора.
Частые ошибки
- Не возвращать мяч из-под пола. Без
y = -yмяч уходит в минус и может «застрять», бесконечно меняя знак скорости. - Считать потерю энергии через $e$, а не $e^2$. Скорость множится на $e$, а кинетическая энергия — на $e^2$; доля потерь равна $1 - e^2$.
- Игнорировать дрейф между отскоками. Если он велик, виноват интегратор или шаг — энергия это покажет раньше глаз.
Итог
- Реальная симуляция объединяет силы, события, отскоки и учёт энергии.
- Между ударами энергия почти сохраняется, на ударе падает на долю $1-e^2$.
- График энергии восстанавливает всю динамику и мгновенно выдаёт баги.
- Зеркальный возврат $y=-y$ — простое устойчивое разрешение проникновения сквозь пол.