Скорость, ускорение и трасса движения в числах

Траектория — это таблица чисел, и читать её надо так же внимательно, как код.

Состояние тела в кинематике — это пара «координата и скорость» в данный момент; зная состояние и силы, можно предсказать будущее.

Состояние и его эволюция

В программировании удобно думать о теле как об объекте с полем положения и полем скорости. Симуляция — это функция, которая берёт текущее состояние и возвращает следующее. Для одномерного движения состояние — два числа $(x, v)$. Печатая их на каждом шаге, мы получаем траекторию состояния: историю того, как менялись положение и скорость.

Средняя скорость на интервале — это наклон координаты по времени:

$$v_{\text{ср}} = \frac{x(t_2) - x(t_1)}{t_2 - t_1}.$$

А мгновенная скорость — предел этого наклона при $t_2 \to t_1$. В симуляции мы как раз и приближаем мгновенную скорость средней на коротком шаге.

Бросок вверх: читаем траекторию

Подбросим тело вверх со скоростью $v_0 = 10$ м/с под действием гравитации $g = 9.8$. Скорость будет убывать, в верхней точке станет нулём, затем тело пойдёт вниз. Напечатаем таблицу и найдём момент разворота прямо по числам.

g = 9.8
x, v, dt = 0.0, 10.0, 0.1
peak_t, peak_x = 0.0, 0.0
for n in range(21):
    t = n * dt
    if x > peak_x:
        peak_x, peak_t = x, t
    print(f"t={t:.1f}  x={x:6.2f}  v={v:6.2f}")
    v = v - g * dt   # сначала обновим скорость (полу-неявный шаг)
    x = x + v * dt
print(f"вершина около t={peak_t:.1f}, высота x={peak_x:.2f}")

Вывод:

t=0.0  x=  0.00  v= 10.00
t=0.1  x=  0.90  v=  9.02
t=0.2  x=  1.71  v=  8.04
t=0.3  x=  2.41  v=  7.06
t=0.4  x=  3.02  v=  6.08
t=0.5  x=  3.53  v=  5.10
t=0.6  x=  3.94  v=  4.12
t=0.7  x=  4.26  v=  3.14
t=0.8  x=  4.47  v=  2.16
t=0.9  x=  4.59  v=  1.18
t=1.0  x=  4.61  v=  0.20
t=1.1  x=  4.53  v= -0.78
t=1.2  x=  4.36  v= -1.76
t=1.3  x=  4.08  v= -2.74
t=1.4  x=  3.71  v= -3.72
t=1.5  x=  3.24  v= -4.70
t=1.6  x=  2.67  v= -5.68
t=1.7  x=  2.01  v= -6.66
t=1.8  x=  1.24  v= -7.64
t=1.9  x=  0.38  v= -8.62
t=2.0  x= -0.58  v= -9.60
вершина около t=1.0, высота x=4.61

По таблице видно всё поведение: скорость линейно падает на $0.98$ за каждый шаг ($g \Delta t$), в районе $t = 1.0$ она проходит через ноль и меняет знак — это и есть вершина. Высшая точка $\approx 4.59$ м. Аналитически вершина достигается при $t = v_0 / g \approx 1.02$ с на высоте $\frac{v_0^2}{2g} \approx 5.10$ м — наша грубая сетка немного занижает, но качественно картина верна.

Как работает под капотом

Заметьте порядок: здесь мы сначала обновляли скорость, потом координату. Это уже другой интегратор (полу-неявный Эйлер), и он ведёт себя заметно лучше «наивного» из прошлого урока. Знак скорости — главный индикатор: пока $v \gt 0$, тело поднимается; $v \lt 0$ — падает; смена знака помечает экстремум координаты. Так движок определяет, например, момент, когда персонаж достиг пика прыжка, чтобы переключить анимацию.

Печать таблицы — недооценённый инструмент отладки физики. Прежде чем рисовать красивую картинку, всегда полезно вывести голые числа: они сразу показывают, разумны ли масштабы, не растёт ли что-то взрывообразно, в правильную ли сторону направлены силы.

Частые ошибки

  • Искать вершину по координате, а не по смене знака скорости. Смена знака $v$ — надёжный и дешёвый признак экстремума.
  • Слишком грубый шаг. При $\Delta t = 0.1$ мы «промахиваемся» мимо точной вершины. Если нужна точность момента разворота, шаг надо уменьшить или интерполировать.
  • Игнорировать единицы. Скорость в м/с, ускорение в м/с², время в секундах — смешивать нельзя.

Итог

  • Состояние тела — пара $(x, v)$; симуляция переводит состояние в следующее.
  • Смена знака скорости отмечает экстремум координаты (вершину прыжка).
  • Печать таблицы состояния — первый и лучший инструмент отладки.
  • Грубая сетка сдвигает момент разворота; точность требует малого $\Delta t$.
Проверьте себя
1. Какой признак в таблице состояния указывает на вершину броска вверх?
AМаксимум скорости
BСмена знака скорости с плюса на минус
CОбнуление координаты
DМаксимум ускорения
2. Чему равна средняя скорость на интервале?
AПроизводной ускорения
BНаклону координаты: (x2-x1)/(t2-t1)
CСумме скоростей
DПлощади под графиком ускорения
3. Почему при Δt=0.1 момент вершины определён неточно?
AОшибка в коде
BСетка по времени грубая и не попадает точно в момент v=0
Cg задано неверно
DСкорость не меняется