В данной работе рассмотрим одну из важнейших задач прикладной механики, а именно задачу внешней баллистики(задачу о плоском движении тела, под действием земного тяготения, брошенного под углом к горизонту с некоторой начальной скоростью).
Сформулируем задачу и рассмотрим несколько случаев.
Построим график траектории полёта для 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
Автор: Maximka200
