Бросок тела с высоты, моделируем на Python

Добрый день, уважаемые читатели. Сейчас вы читаете довольно специфичную статью для нашего блога. Как вы могли заметить, мы начали экспериментировать и публиковать статьи на тематику математики. Также, я хотел бы начать цикл статей про физику, начиная с самых азов. И сегодняшней темой стал бросок тела с высоты паралельно горизонту.

Примечание. Те, кто зашёл сюда из интереса к физике, не пугайтесь названия языка программирования в заголовке статьи. Программированию будет посвящен последний раздел, до этого будет лишь обсуждение физических процессов.

Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.
А на YouTube-канале ты найдешь обучающие видео по программированию. Подписывайся!

Сегодня мы рассматриваем следующую ситуацию: мы кидаем тело вниз с определённой высоты с некой начальной скоростью паралельно земле, так, чтобы его траектория выглядела так:

Равноускоренное движение

Разберём физику равноускоренного движения. Допустим, что тело начало двигаться с состояния покоя равноускоренно. Примем ускорение за a, а скорость за v и рассмотрим изменение v относительно изменения времени t.

Условно разделим временной промежуток на равные отрезки и примем их за \Delta t. Если их количество равно n, то \Delta t \cdot n = t.

В конце первого промежутка \Delta t v_1 = a \cdot \Delta t, после второго v_2 = 2 \cdot a \cdot \Delta t и т.д. Общая формула: v_n = n \cdot a \cdot \Delta t \Rightarrow v_n = a \cdot t.

Следовательно, если у тела была какая-то начальная скорость, а оно двигается равноускоренно с ускорением a, то его скорость через t равна v = v(t) = v_0 + a \cdot t. Этим мы и будем пользоваться в дальнейшем.

Бросок тела

Предположим, что мы бросаем тело (примем его за материальную точку, не имеющую массу) с высоты h паралельно земле со начальной скоростю v_0. Обозначим вертикальную скорость тела (которая изначально равна 0 и меняется под воздействием силы тяжения) v_y и рассмотрим его изменение в зависимости от t.

Не будем рассматривать законы притяжения двух тел и примем ускорение свободного падения за g = 9.81 (в некоторых задачах для облегчения рассчетов g часто равно 10). g — обычное ускорение, вследствии чего v_y = g \cdot t (см. Равноускоренное движение). Горизонтальная скорость v_x, которую мы сами придаём телу, с истечением времени не изменяется (v_x = v_0).

Теперь вычислим моментальную скорость тела. Скорость — векторная величина, которая имеет своё направление. Очевидно, что v_x и v_y перпендикулярны между собой, вследствии чего их результирующая скорость равна v = v(t) = \sqrt{v_y^2 + v_x^2} = \sqrt{(gt)^2 + v_0^2}.

Путь, пройденный под воздействием равноускоренного движения

Мы не знаем формулу, как вычислить путь (обозначим S, пройденный телом за время t, если оно двигается равноускоренно с ускорением a, но мы можем её вывести. Снова разобъём наш временной промежуток на n частей, равных \Delta t.
В конце нулевого промежутка (когда скорость не поменяется) S_1 = S(t) = v_0 \cdot \Delta t.
После первого промежутка, когда скорость увеличилась S_2 = S(t) = v_0 \cdot t  + (v_0 + a \Delta t) \cdot \Delta t.
По истечению n-го промежутка, когда скорость увеличивалась n — 1 раз: S_n = S(t) = v_0 \cdot \Delta t + (v_0 + a \Delta t) \cdot \Delta t + \ldots + (v_0 + (n-1)a \Delta t) \cdot \Delta t.


Преобразуем полученное выражение:

    \[S_n = S(t) = v_0 \cdot \Delta t + (v_0 + a \Delta t) \cdot \Delta t + \ldots + (v_0 + (n-1)a \Delta t) \cdot \Delta t =\]


    \[= \Delta t(v_0 + (v_0 + a \Delta t) + \ldots + (v_0 + (n-1)a\Delta t) = \Delta t(nv_0 + a \Delta t + 2a\Delta t + \ldots + (n-1)a \Delta t) =\]


    \[= v_0 \cdot t + \frac{na\Delta t^2}{2}(n-1) = v_0 \cdot t + \frac{na\Delta t^2}{2}(\frac{t - \Delta t}{\Delta t}) = v_0 \cdot t + \frac{na\Delta t(t - \Delta t)}{2} = v_0 \cdot t + \frac{at^2 - a\Delta t}{2}\]

Те, кто знаком с определением определённого интеграла, понимают, что мы будем дальше делать. Т.к. скорость увеличивается равномерно, то размер каждого временного промежутка \Delta t должно стремится к 0. Вычислим границу S(t) при \Delta t \to 0.

    \[\lim_{\Delta t \to 0}{S(t)} = \lim_{\Delta t \to 0}{v_0 \cdot t +  \frac{at^2 - a\Delta t}{2}} = \lim_{\Delta t \to 0}{v_0 \cdot t + \frac{at^2 - a \cdot 0}{2}} = v_0 \cdot t + \frac{at^2}{2}\]


Это и есть конечная формула для расчёта пути при равноускоренном движении.

Бросок тела, время полёта и вычисление координат


Из полученной выше формулы, вычислим время полёта, обозначив его t_{max}. Полёт длится до тех пор, пока высота, на которой находится тело, не равна нулю. Если высота это h, то мы получаем h = \frac{g t_{max}^2}{2} \Rightarrow t_{max} = \sqrt{\frac{2h}{g}}.

Если мы хотим изобразить график изменения положения тела в системе координат, где (0, 0) — подножье «горы», откуда мы кидаем тело, то нам необходимо научиться вычислять координаты тела в этой системе в зависимости от времени. Таким образом мы получаем функцию, заданую параметрически:

    \[x = x(t) = h - \frac{gt^2}{2}\]


    \[ y = y(t) = v_0 \cdot t}\]


Начнём с координаты x, которая является текущей высотой тела. За время t, как мы уже знаем, тело пролетит «вниз» (\Delta h) : \frac{g t^2}{2}. В следствии чего, текущая высота тела равна h = h(t) = h_0 - \frac{g t^2}{2}.

Координата y зависит только от v_y, и потому равна v_y \cdot t.

Также вычислим угол наклона вектора результирующей скорости:

    \[tg(\alpha) = \frac{v_y}{v_x} = \frac{gt}{v_0}\]

Как заключение, привожу полный список формул.


    \[\boxed{v = v(t) = v_0 + at}\]


    \[\boxed{S = S(t) = v_0 \cdot t + \frac{at^2}{2}}\]


    \[\boxed{v = v(t) = \sqrt{v_y^2 + v_x^2} = \sqrt{(gt)^2 + v_0^2}}}\]


    \[\boxed{v_x = v_0}\]


    \[\boxed{v_y = g \cdot t}\]


    \[\boxed{x = h - \frac{gt^2}{2}}\]


    \[\boxed{y = v_y \cdot t}\]


    \[\boxed{tg(\alpha) = \frac{v_y}{v_x} = \frac{gt}{v_0}}\]


    \[\boxed{t_{max} = \sqrt{\frac{2h}{g}}}\]

Траектория падения в виде графика на Python

Теперь займёмся построением траектории падения тела. Я предлагают создать класс Fall, в котором мы определим следующие методы:

  • x(t) — координата на Ox в зависимости от аргумента t
  • y(t) — координата на Oy в зависимости от аргумента t
  • max_time() — возвращает время падения тела

Для реализации задуманного, я предлагаю использовать matplotlib и numpy. Также, я использую jupyter-themes для изменения стиля графика.

In[1]:
import numpy as np
import matplotlib.pyplot as plt
from jupyterthemes import jtplot

class Fall(object):

    # выберем более точное значение g
    g = 9.8066

    def __init__(self, h, v0):
        self.__h = h
        self.__v0 = v0

    def y(self, t):
        return self.__h - (Fall.g * (t**2))/2

    def x(self, t):
        return self.__v0 * t

    def max_time(self):
        return np.sqrt(2 * self.__h / Fall.g)   

Теперь создадим экземпляр класса Fall со значением высоты в 50 и скорости 10. Также построим график в matplotlib.

In[2]:
h = 50; v0 = 10;

fall = Fall(h, v0)
t_max = fall.max_time()

jtplot.style('onedork')
plt.figure(figsize=(14, 7))
plt.ylim([0, h * 1.2])
plt.xlim([0, (v0 * t_max) * 1.2])

t = np.linspace(0, t_max, 1000)
x = fall.x(t)
y = fall.y(t)

plt.plot(x, y, color='red', linewidth=2, label='x = x(t) \n y = y(t)')
plt.legend(loc='upper right', 
            fontsize=27, 
            title='Движение тела')

Мы используем методы x() и y(), чтобы вычислить координаты тела для значений из отрезка [0, max_time]. Также, используя разметку LaTeX, я создал легенду для графика в правом верхнем углу (с помощью plt.legend).

Взглянем на результат:

Взглянув на этот график, мы можем с легкостью понять, что тело пролетело вперёд ~32 метра до падения.

Заключение

Сегодня мы рассмотрели бросок тела с высоты, паралельно земле и физический процесс, связанный с этим событием. Также, мы построили график, который отражает траекторию движения тела под воздействием силы притяжения.

Желаю вам огромной кинетической энергии и большого ускорения.
Документ, в котором вкратце описаны идеи статьи находится по ссылке.

Также подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.