Добрый день, уважаемые читатели CodeBlog. Эта статья является продолжением статьи про бросок тела с высоты. Советую ознакомиться с материалом прошлой статьи из рубрики «Физика», ведь очень много вещей мы разобрали и доказали именно там. Здесь мы будем использовать только формулы, которые мы доказали ранее.
И на повестке дня — бросок тела под углом к горизонту.
Примечание. Те, кто зашёл сюда из интереса к физике, не пугайтесь названия языка программирования в заголовке статьи. Программированию будет посвящен последний раздел, до этого будет лишь обсуждение физических процессов.
Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.
А на YouTube-канале ты найдешь обучающие видео по программированию. Подписывайся!
Бросаем камень
Предположим, что мы находимся на земле и бросаем камень (или любой другой предмет) под углом к горизонту (условимся, что земля под ногами идеально ровная, а сопротивления воздуха не существует). Также пусть мы совершаем бросок со скоростью
.
Наша задача: изучить, как долго будет лететь камень, какой максимальной высоты он достигнет и сколько пролетит расстояния в горизонтальном направлении. Начнём.
Т.к. мы бросаем камень под углом, разложим скорость (векторную величину) на и
, то есть вертикальную и горизонтальную составляющие скорости. Используя прямоугольный треугольник и соотношения тригонометрических функций с его сторонами, получаем
, а
.

Вверх и только вверх!
Тело набирает высоту, пока вертикальная составляющая его скорости не равна нулю. Т.к. на тело действует ускорение свободного падения, которое уменьшает его скорость, закон изменения выглядит таким образом:
Приравняв к нулю, мы можем найти время, за которое тело достигает максимальной высоты:
Также мы с легкостью можем вычислить высоту, которую достигает наш объект в зависимости от времени:
Примечание. Как проверить правильность этой формулы? Во-первых, проверить размерность. Здесь у нас размерность:
Во-вторых, воспользоваться математикой. Разумно предположить, что траектория полёта (т. е. график ) является параболой, схожей на график функции
.
является выпуклой вверх. Это можно доказать, используя свойство второй производной:
Вторая производная на всех области определения функции отрицательна, то есть функция всегда выпукла вверх. У нас такая же ситуация, ведь:
Т. к. — константа равная ~ 10, то вторая производная функции
также всегда отрицательна, т. е.
описывает параболу, выпуклую вверх.
Сколько летит тело?
Т. к. мы не будем учитывать сопротивление воздуха, то горизонтальная составляющая скорости не изменяется, а расстояние, которое пролетело тело в горизонтальном направлении вычисляется по формуле:
Далее логично предположить, что тело будет упадёт на землю за время, равное двойному времени подъёма на максимальную высоту. Докажем это. Максимальная высота подъёма равна:
Рассмотрим, за какое кол-во времени тело опустится с такой высоты, учитывая, что на него действует только ускорение свободного падения.
Таким образом, время полёта равняется двойному времени подъёма, а точка достижения максимальной высоты находится ровно по центру траектории движения.
Визуализируем траекторию с помощью Python
Для визуализации траектории я буду использовать matplotlib
, а для выполнения вычислений — NumPy
. Также я установлю стиль для графика с помощью jupyterthemes.jtplot
.
In[1]: import matplotlib.pyplot as plt import numpy as np from jupyterthemes import jtplot jtplot.style('onedork')
Далее мы реализуем функцию, которая будем производить вычисление и
в зависимости от
.
In[2]:
def plot_trace(v0, alpha, file=None, **kwargs):
# acceleration of gravity
g = 9.8066
# time to max height
tp = v0 * np.sin(alpha) / g
# converting to time range
t = np.linspace(0, 2 * tp, 1000)
# x axis
x = v0 * np.cos(alpha) * t
# y axis
y = v0 * np.sin(alpha) * t - g * (t**2) / 2
# change size for figure
plt.figure(figsize=(20, 10))
plt.plot(x, y, **kwargs)
# xlim
plt.xlim([-1, np.max(x) * 1.1])
# ylim
plt.ylim([-1, np.max(y) * 1.1])
# axis labels
plt.xlabel('X', fontsize=24)
plt.ylabel('Y', fontsize=24)
# chart title
plt.title(f'
', fontsize=32)
plt.grid(True)
# set legend
if 'label' in kwargs:
plt.legend(loc='best', fontsize=32)
if file is not None:
plt.savefig(file)
К сожалению, описание базовых функций matplotlib.pyplot
выходит за рамки этой статьи, однако если вы не понимаете, что делает та или иная функция, просто введите поисковый запрос типа '<name of function examples>'
.
Для и
функция работает следующим образом:
In[3]:
plot_trace(30, 0.5, label='trace', color='g')

Заключение
В этой статье мы рассмотрели физику такого процесса, как бросок тела под углом к горизонту и создали функцию отображения траектории полёта, используя язык программирования Python. Данная функция имеет возможность сохранить полученный результат в графический файл, а также всячески настраивать стиль самого графика.
Советую прочитать статью «Производная. Определение и базовые теоремы«.
А также подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.