Движение спускаемого аппарата в атмосфере

Простейшая плоская модель движения СА в атмосфере (Nguyen X. Vinh, Adolf Busemann, Robert D. Culp Hypersonic and planetary entry flight mechanics) The Unevrsity of Michigan Press

Спускаемый аппарат, рассматриваемый как материальная точка с заданной массой, коэффициентом лобового аэродинамического сопротивления \(C_d\) и коэффициентом подъемной силы \(C_l\) начинает движение на круговой орбите высотой 100 км. Уравнения движения СА имеют вид: \[\frac{dV}{dt} = - \frac{C_d S_m q}{m} - g \sin \theta,\] \[V \frac{d \theta}{dt} = \frac{C_l S_m q}{m} - \left(g-\frac{V^2}{r}\right) \cos \theta,\] \[\frac{dr}{dt} = V \sin \theta\]

где \(V\) - скорость СА; \(\vartheta\) – угол наклона траектории (угол между вектором скорости и линией местного горизонта); \(r\) – расстояние от центра Земли до центра масс СА; \(g\) – ускорение свободного падения на высоте \(h\); \(m\) – масса СА; \(S_m\) – характерная площадь (площадь Миделя); \(C_d\) – аэродинамический коэффициент лобового сопротивления; \(C_l\) – аэродинамический коэффициент подъёмной силы; \(q\) – скоростной напор, зависящий от плотности воздуха и скорости движения СА: \[q = \frac{\rho V^2}{2}\]

ПараметрЗначение
Масса СА, кг1000
\(C_d\)1.2
\(C_l\)0.0
\(S_m\), м\(^2\)5

Код на языке Python

Подключение необходимых библиотек

from collections import namedtuple
import scipy
from scipy.integrate import solve_ivp
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.pylab as pylab
params = {'legend.fontsize': 14, 'figure.figsize': (10, 7), 'axes.labelsize': 14,
         'axes.titlesize':14, 'xtick.labelsize':14,'ytick.labelsize':14}

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.pylab as pylab
params = {'legend.fontsize': 14, 'figure.figsize': (10, 7), 'axes.labelsize': 14,
         'axes.titlesize':14, 'xtick.labelsize':14,'ytick.labelsize':14}
pylab.rcParams.update(params)

Модель изменения плотности воздуха в диапазоне от 0 до 100 км с погрешностью 1,5% (В. А. ЯРОШЕВСКИЙ “АППРОКСИМАЦИЯ МОДЕЛИ СТАНДАРТНОЙ АТМОСФЕРЫ” Ученые записки ЦАГИ, т. XL, №3, 2009.)

a  = np.array([-6.3759,-7.3012,-1.1817])
b  = np.array([-0.4754,-0.0096,-0.0068,-0.0120,0.0042]);
c  = np.array([ 0.1803, 0.0872,-0.0153, 0.0145,0     ]);

def rho(h):
  # Функция вычисления плотности воздуха 
  # высота h задаётся в километрах
  # результат -- плотность кг/м3
  x = h/50.0-1
  sa = a[0] + a[1]*x + a[2]*x*x
  sbc= sum( (b[i]*np.cos((i+1)*np.pi*x) + c[i]*np.sin((i+1)*np.pi*x) for i in range(5)) ) 
  return np.exp(sa + sbc)

Константы

# Гравитационный параметр Земли
mu = 398600.4415e9
# Радиус Земли
Re = 6371000.0

Функция вычисления ускорения свободного падения м/с\(^2\) на высоте h (в метрах)

def g_acc(h):
  # 
  return mu/(Re+h)**2

Функция правых частей

Функция правых частей дифференциальных уравнений: вычисление правых частей дифференциальных уравнений для момента времени t и вектора состояния y = [r(t), v(t), theta(t)]:

def dydt(t, y, p):  

  # Радиус-вектор точки в момент времени t
  r     = y[0]
  # Скорость  в момент времени t 
  v     = y[1]
  # Угол наклона траекториии  в момент времени t  
  theta = y[2]
    
  # Высота (км)
  h     = (r - Re)*0.001
  # Скоростной напор Н/м^2
  q     = rho(h)*v*v/2  
  # Ускорение свободного падения
  g     = g_acc(r - Re)
    
  # dv/dt =   
  dv    = - q*p.CD*p.Sm/p.mass - g*np.sin(theta) 
  # dtheta/dt =   
  dtheta= (q*p.CL*p.Sm/p.mass - (g - v*v/r)*np.cos(theta))/v
  # dr/dt =    
  dr    = v*np.sin(theta) 
  # ds/dt
  ds    = (Re/r)*v*np.cos(theta)
  
  return (dr,dv,dtheta,ds)

Функция для остановки процесса интегрирования при достижении нулевой высоты

def event_h_eq_0(t, y):
  # Функция-"детектор", передаваемая в интегратор (параметр events), 
  # для определения времени достижения нулевой высоты и 
  # остановки процесса интегрирования  
  
  return y[0]-Re  

# функция определяется условие h = 0 при движении "вниз"
event_h_eq_0.direction = -1
# функция-детектор активна
event_h_eq_0.terminal  = True  
# функция возвращает высоту  

Параметры системы

params = namedtuple("params", "CD CL mass")
# Масса тела
params.mass = 60000.0 
# Аэродинамические коэфиициенты, 
# которые в общем случае зависят от числа Маха, 
# угла атаки
params.CD   = 1.4    # Коэффицент лобового сопротивления 
params.CL   = 0.0    # Коэффицент подъёмной силы
# Площадь миделя
params.Sm   = np.pi*3**2/4     

Начальные условия

# Начальные условия
h0     = 120e3 # Начальная высота [м]
v0     = 2800 # Начальная скорость [м/c]
theta0 = np.deg2rad(30.0)  # начальный угол наклона траектории [радиан]

Запуск процесса интегрирования

sol = solve_ivp(lambda t,y: dydt(t,y,params), [0, 1000.0], [Re+h0, v0, theta0, 0], method='LSODA', events = [event_h_eq_0], rtol = 1e-9)

Результаты

График изменения высоты от времени

plt.plot(sol.t,(sol.y[0]-Re)*0.001);
plt.xlabel('t, c');plt.ylabel('h, км');

Зависимость скоростного напора от высоты

plt.plot((sol.y[0]-Re)*0.001,0.001*rho((sol.y[0]-Re)*0.001)*sol.y[1]*sol.y[1]/2.0);
plt.xlabel('h, км');plt.ylabel('q, кН/м$^2$');

Пример кода на языке Python (в Google Colab)


© 2024. All rights reserved.

Powered by Hydejack v9.1.6