Скорость, ускорение и трасса движения в числах
Траектория — это таблица чисел, и читать её надо так же внимательно, как код.
Состояние тела в кинематике — это пара «координата и скорость» в данный момент; зная состояние и силы, можно предсказать будущее.
Состояние и его эволюция
В программировании удобно думать о теле как об объекте с полем положения и полем скорости. Симуляция — это функция, которая берёт текущее состояние и возвращает следующее. Для одномерного движения состояние — два числа $(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$.