Реализуй на python баллистический алгоритм моделирования траектории свободного движения артиллерийского снаряда в атмосфере вращающейся сферической Земли
python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# начальные параметры выстрела
v0 = 1000 # начальная скорость, м/с
theta = np.pi / 4 # угол выстрела, рад
m = 10 # масса снаряда, кг
# начальные координаты и скорости
x0 = 0
y0 = 0
z0 = 0
vx0 = v0 * np.sin(theta)
vy0 = 0
vz0 = v0 * np.cos(theta)
# параметры Земли
R = 6371e3 # радиус Земли, м
w = 2 * np.pi / 86400 # угловая скорость вращения Земли, рад/с
# расчет основных параметров
rho = 1.2 # плотность воздуха, кг/м^3
A = np.pi * (0.01 ** 2) # площадь поперечного сечения, м^2
C_d = 0.47 # коэффициент лобового сопротивления
g = 9.81 # ускорение свободного падения, м/с^2
# шаг по времени
dt = 0.01
# массивы для хранения координат
x = [x0]
y = [y0]
z = [z0]
# массивы для хранения скоростей
vx = [vx0]
vy = [vy0]
vz = [vz0]
# расчет траектории полета
while z[-1] >= 0:
# определение угла между направлением выстрела и направлением на полюс Земли
lat = np.arcsin(z[-1] / R)
theta2 = np.arctan2(y[-1], x[-1])
phi = w * dt
dtheta = phi * np.sin(lat)
dlambda = phi * np.cos(lat)
lat2 = lat + dtheta
theta2 += dlambda
R2 = np.array([[np.cos(theta2), -np.sin(theta2), 0],
[np.sin(theta2), np.cos(theta2), 0],
[0, 0, 1]])
latlon = np.array([[np.cos(lat2) * np.cos(theta2)],
[np.cos(lat2) * np.sin(theta2)],
[np.sin(lat2)]])
v = np.array([[vx[-1]], [vy[-1]], [vz[-1]]])
v_cor = np.cross(np.array([0, 0, w]), latlon.T).T
F_cor = -2 * m * np.dot(v, v_cor) * np.sin(theta)
F_drag = -0.5 * rho * np.linalg.norm(v) ** 2 * A * C_d
a = (F_drag + F_cor) / m - np.array([0, 0, g])
v += a * dt
coord = np.dot(R2, v) * dt
x.append(x[-1] + coord[0][0])
y.append(y[-1] + coord[1][0])
z.append(z[-1] + coord[2][0])
vx.append(v[0][0])
vy.append(v[1][0])
vz.append(v[2][0])
# отображение траектории полета
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(x, y, z)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
В данном примере используется численный метод Эйлера для расчета изменения скорости и координаты снаряда на каждом шаге времени. Результатом выполнения данного кода является 3D-график траектории полета снаряда в атмосфере вращающейся сферической Земли.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет