Капстоун: прыгающий мяч и баланс энергии

Финальная сцена курса: мяч под гравитацией прыгает на полу, теряя энергию на каждом отскоке — и мы за всем этим следим числами.

Энергетический учёт в симуляции — отслеживание полной энергии для контроля физичности: между ударами она должна почти сохраняться, а на ударах падать ровно на величину потерь.

Что мы собираем вместе

Этот урок — синтез всего курса. Мы соберём симуляцию, где встречаются сразу несколько изученных идей: интегрирование движения под постоянной силой (гравитация), обнаружение события (касание пола), отскок с коэффициентом восстановления и непрерывный учёт энергии. Полная энергия мяча $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$ — простое устойчивое разрешение проникновения сквозь пол.
Проверьте себя
1. Как ведёт себя полная энергия мяча между отскоками (в свободном полёте)?
AРезко растёт
BПочти сохраняется (медленный дрейф — численный артефакт)
CПадает до нуля
DСкачет случайно
2. На какую долю падает кинетическая энергия при отскоке с коэффициентом e=0.9?
AНа 10% (1−e)
BНа 19% (1−e²=1−0.81)
CНа 90%
DНе меняется
3. Зачем при ударе о пол выполняется строка y = -y?
AДля красоты вывода
BЧтобы вернуть мяч, провалившийся за шаг под пол, обратно над поверхностью
CЧтобы удвоить скорость
DЧтобы сохранить импульс