В этой статье мы продолжим решать задачу внешней баллистики и разберём четвёртый и пятый случаи. Они более общие.
Мы учтём зависимость коэффициента лобового сопротивления от скорости, а также зависимость плотности воздуха от высоты.
Показано, что в этом случае аналитическое решение невозможно, поэтому нужно использовать численные методы.
Написан алгоритм численного решения данной задачи.
Сейчас напишем на Python код для моделирования полёта снаряда с учётом вышеизложенного:
(начальная скорость 600 м/с, угол 55 градусов, масса снаряда 50 кг)
import numpy as np
import matplotlib.pyplot as plt
# Константы
g = 9.81 # м/с²
m = 50.0 # масса тела, кг
S = 0.01 # площадь поперечного сечения, м²
rho0 = 1.225 # плотность воздуха на уровне моря, кг/м³
H = 8000 # масштабная высота, м
a = 343 # скорость звука, м/с
v0 = 600 # начальная скорость, м/с
theta = np.radians(55) # начальный угол, рад
dt = 0.01 # шаг интегрирования, с
t_end = 98.4 # конечное время, с
# Начальные условия
x, y = 0, 0
vx, vy = v0 * np.cos(theta), v0 * np.sin(theta)
# Массивы для хранения результатов
t = np.arange(0, t_end, dt)
X, Y = np.zeros_like(t), np.zeros_like(t)
VX, VY = np.zeros_like(t), np.zeros_like(t)
# Функция для вычисления cx(M)
def cx(M):
if M <= 0.73:
return 0.157
elif M < 0.82:
return 0.033 * M + 0.133
elif M < 0.91:
return 0.161 + 3.9 * (M - 0.823) ** 2
elif M < 1.00:
return 1.5 * M - 1.176
else:
return 0.384 - 1.6 * (M - 1.176) ** 2
# Функция плотности воздуха
def rho(h):
return rho0 * np.exp(-h / H)
# Система ОДУ
def f(state, t):
x, y, vx, vy = state
v = np.sqrt(vx ** 2 + vy ** 2)
M = v / a
rho_h = rho(y)
cx_val = cx(M)
Fx = 0.5 * rho_h * v ** 2 * S * cx_val * vx / v
Fy = 0.5 * rho_h * v ** 2 * S * cx_val * vy / v
dxdt = vx
dydt = vy
dvxdt = -Fx / m
dvydt = -g - Fy / m
return np.array([dxdt, dydt, dvxdt, dvydt])
# Метод Рунге-Кутты 4-го порядка
def rk4_step(state, t, dt):
k1 = dt * f(state, t)
k2 = dt * f(state + 0.5 * k1, t + 0.5 * dt)
k3 = dt * f(state + 0.5 * k2, t + 0.5 * dt)
k4 = dt * f(state + k3, t + dt)
return state + (k1 + 2 * k2 + 2 * k3 + k4) / 6
# Интегрирование
state = np.array([x, y, vx, vy])
for i, t_val in enumerate(t):
X[i], Y[i], VX[i], VY[i] = state
state = rk4_step(state, t_val, dt)
# Визуализация
plt.figure(figsize=(10, 6))
plt.plot(X, Y, label='Траектория')
plt.xlabel('X, м')
plt.ylabel('Y, м')
plt.title('Траектория полёта тела')
plt.grid(True)
plt.legend()
plt.show()
# Вывод результатов
print(f"Дальность полёта: {X[-1]:.2f} м")
print(f"Максимальная высота: {np.max(Y):.2f} м")
Результат моделирования представлен ниже:
Видно, то снаряд в таком случае пролетит 29 км и залетит на высоту 11,5 км.
При этом было допущение, что зависимость плотности воздуха от высоты экспоненциальная
(это, конечно не так, это требует написания отдельной статьи).
Таким образом, в данной статье продолжено решение задачи внешней баллистики, было учтено, что плотность воздуха меняется с высотой и использован закон сопротивления 1943 года.
Написан код, который моделирует траекторию полёта тела в этом случае.
Продолжение исследования будет далее, в следующих статьях......
Литература:
-
Окунев Б. Н. «Решение основной задачи внешней баллистики при квадратичном законе сопротивления воздуха» (1932).
-
Окунев Б. Н. «Основная задача внешней баллистики и аналитические методы её решения» (1934).
-
Дмитриевский А. А., Лысенко Л. Н. «Внешняя баллистика» (2005).
-
Лысенко А. Н. «Внешняя баллистика» (2024).
-
Шапиро Я. М. «Внешняя баллистика» (1946).
-
Беляева С. Д. «Внешняя баллистика с примерами и задачами» (2023).
8.Мандрыка А. П. «Баллистические исследования Леонарда Эйлера» (2017)
9.
https://en.wikipedia.org/wiki/Projectile_motion#Time_of_flight_with_air_resistance
Автор: Maximka200
