В данной работе рассмотрим одну из важнейших задач прикладной механики, а именно задачу внешней баллистики(задачу о плоском движении тела, под действием земного тяготения, брошенного под углом к горизонту с некоторой начальной скоростью).
Сформулируем задачу и рассмотрим несколько случаев.


Построим график траектории полёта для v0=20 м/с и a=30 градусов:

Второй случай:Закон сопротивления Стокса.


Построим график траектории полёта тела для начальных данных:
v0=70 м/с, a=55 градусов, k=0,04 кг/с, m=0,5 кг.

Третий случай:Закон сопротивления Ньютона.


Примечание: эта система дифференциальных уравнений в третьем случае была решена ещё Леонардом Эйлером в 18 веке, когда не было компьютеров и писали перьями при свечах...
(источник 8).
Напишем код на Python для моделирования полёта снаряда с начальной скоростью v0=250 м/с,
a=60 градусов, массой m=20 кг и диаметром 20 см:
import numpy as np import matplotlib.pyplot as plt from scipy.integrate import solve_ivp class BallisticsSimulator: def __init__(self): # Физические константы self.g = 9.81 # м/с² self.rho = 1.225 # кг/м³ (плотность воздуха на уровне моря) def calculate_k(self, diameter, mass, Cd=0.3): """ Расчёт коэффициента сопротивления k Параметры: diameter: диаметр снаряда в метрах mass: масса снаряда в кг Cd: коэффициент аэродинамического сопротивления (по умолчанию 0.3) """ A = np.pi * (diameter / 2) ** 2 # площадь поперечного сечения k = (Cd * self.rho * A) / (2 * mass) return k def equations_of_motion(self, t, state, k): """ Система дифференциальных уравнений движения state = [x, vx, y, vy] """ x, vx, y, vy = state # Скорость v = np.sqrt(vx**2 + vy**2) # Ускорения ax = -k * v * vx ay = -self.g - k * v * vy return [vx, ax, vy, ay] def simulate(self, v0, angle_deg, x0=0, y0=0, diameter=0.1, mass=10, Cd=0.3, t_max=100, dt=0.01): """ Моделирование траектории Параметры: v0: начальная скорость (м/с) angle_deg: угол запуска (градусы) x0, y0: начальные координаты diameter: диаметр снаряда (м) mass: масса снаряда (кг) Cd: коэффициент сопротивления t_max: максимальное время моделирования (с) dt: шаг времени (с) """ # Расчёт коэффициента k k = self.calculate_k(diameter, mass, Cd) # Начальные условия angle_rad = np.radians(angle_deg) vx0 = v0 * np.cos(angle_rad) vy0 = v0 * np.sin(angle_rad) initial_state = [x0, vx0, y0, vy0] # Временная сетка t_span = (0, t_max) t_eval = np.arange(0, t_max, dt) # Решение системы ОДУ solution = solve_ivp( self.equations_of_motion, t_span, initial_state, args=(k,), t_eval=t_eval, method='RK45' ) t = solution.t x = solution.y[0] y = solution.y[2] # Находим точку падения (когда y становится отрицательным) fall_index = np.where(y < 0)[0] if len(fall_index) > 0: fall_index = fall_index[0] t = t[:fall_index + 1] x = x[:fall_index + 1] y = y[:fall_index + 1] return t, x, y, k def plot_trajectory(self, t, x, y, k, v0, angle): """Построение графика траектории""" plt.figure(figsize=(12, 8)) plt.plot(x, y, 'b-', linewidth=2, label='Траектория') plt.scatter(x[0], y[0], color='red', s=100, zorder=5, label='Старт') plt.scatter(x[-1], y[-1], color='green', s=100, zorder=5, label='Падение') plt.xlabel('Расстояние, м', fontsize=12) plt.ylabel('Высота, м', fontsize=12) plt.title(f'Траектория снаряда\n' f'V₀ = {v0} м/с, угол = {angle}°, k = {k:.6f}', fontsize=14) plt.grid(True, alpha=0.3) plt.legend() plt.axis('equal') plt.show() def print_results(self, t, x, y): """Вывод результатов расчёта""" print("=== РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ ===") print(f"Дальность полёта: {x[-1]:.2f} м") print(f"Максимальная высота: {max(y):.2f} м") print(f"Время полёта: {t[-1]:.2f} с") print(f"Конечная скорость: {np.sqrt((x[-1]-x[-2])**2 + (y[-1]-y[-2])**2)/(t[-1]-t[-2]):.2f} м/с") # Пример использования def main(): # Создаём симулятор simulator = BallisticsSimulator() # Параметры запуска v0 = 250 # начальная скорость, м/с angle = 60 # угол запуска, градусы diameter = 0.2 # диаметр снаряда, м (20 см) mass = 20 # масса снаряда, кг # Моделирование t, x, y, k = simulator.simulate( v0=v0, angle_deg=angle, diameter=diameter, mass=mass, Cd=0.3, t_max=100, dt=0.01 ) # Вывод результатов simulator.print_results(t, x, y) # Построение графика simulator.plot_trajectory(t, x, y, k, v0, angle) if __name__ == "__main__": main()
Результат моделирования представлен ниже:

Таким образом, в данной статье начато решение задачи внешней баллистики.
Рассмотрены три различных случая:
1)Без сопротивления воздуха (на уровне школы).
2) С законом сопротивления Стокса ( то есть линейная зависимость от скорости).
3)С законом сопротивления Ньютона (квадратичная зависимость от скорости).
Получены аналитические выражения для траекторий y(x), зависимости дальности полёта
L от начального угла a, найдены формулы для максимальной дальности, угла максимальной дальности, времени полёта и максимальной высоты подъёма.
Таким образом, решена важнейшая задача, возникающая на практике при стрельбе или бросании снарядов.
Продолжение будет далее, в следующих статьях.....
Литература:
Окунев Б. Н. «Решение основной задачи внешней баллистики при квадратичном законе сопротивления воздуха» (1932).
Окунев Б. Н. «Основная задача внешней баллистики и аналитические методы её решения» (1934).
Дмитриевский А. А., Лысенко Л. Н. «Внешняя баллистика» (2005).
Лысенко А. Н. «Внешняя баллистика» (2024).
Шапиро Я. М. «Внешняя баллистика» (1946).
Беляева С. Д. «Внешняя баллистика с примерами и задачами» (2023).
8.Мандрыка А. П. «Баллистические исследования Леонарда Эйлера» (2017)
9.
https://en.wikipedia.org/wiki/Projectile_motion#Time_of_flight_with_air_resistance
