В настоящей публикации мы проанализируем одну из фундаментальных проблем прикладной механики — внешнюю баллистику. Речь пойдет о моделировании плоскопараллельного движения объекта в поле земного тяготения, запущенного под определенным углом к горизонту с заданной начальной скоростью.
Сформулируем условия задачи и детально изучим несколько возможных сценариев.
Постановка задачиСценарий №1: Движение в вакууме (без сопротивления воздуха)
Визуализируем траекторию движения при начальной скорости v0 = 20 м/с и угле запуска a = 30 градусов:
Профиль траектории для первого случая
Второй вариант развития событий: Модель вязкого трения по закону Стокса.
Вариант №2: Линейное сопротивление (закон Стокса)Второй случай: Завершение математического вывода
Построим график движения объекта, исходя из следующих параметров:
v0 = 70 м/с, a = 55 градусов, коэффициент k = 0,04 кг/с, масса m = 0,5 кг.
График полёта при линейном сопротивлении
Третий вариант: Квадратичный закон сопротивления Ньютона.
Третий сценарий: Квадратичная модель сопротивления средыИнтегрирование системы дифференциальных уравнений для третьего случая
Историческая справка: представленная система дифференциальных уравнений была исследована и решена Леонардом Эйлером еще в XVIII веке — задолго до появления компьютеров, во времена, когда расчеты велись вручную при свете свечей…
(см. источник 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
"""
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):
"""
Численное интегрирование траектории
"""
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]
# Обрезка данных после контакта с землей
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} с")
v_final = np.sqrt((x[-1]-x[-2])**2 + (y[-1]-y[-2])**2)/(t[-1]-t[-2])
print(f"Скорость при падении: {v_final:.2f} м/с")
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), проанализировано влияние угла запуска a на дальность L, а также получены формулы для расчета ключевых характеристик: максимальной дальности, оптимального угла броска, времени нахождения в полете и зенита траектории.
Таким образом, мы решили фундаментальную задачу, имеющую огромное практическое значение для баллистических расчетов.
Детальный разбор новых аспектов будет представлен в следующих частях цикла…
Список источников:
Окунев Б. Н. «Решение основной задачи внешней баллистики при квадратичном законе сопротивления воздуха» (1932).
Окунев Б. Н. «Основная задача внешней баллистики и аналитические методы её решения» (1934).
Дмитриевский А. А., Лысенко Л. Н. «Внешняя баллистика» (2005).
Лысенко А. Н. «Внешняя баллистика» (2024).
Шапиро Я. М. «Внешняя баллистика» (1946).
Беляева С. Д. «Внешняя баллистика с примерами и задачами» (2023).