Перейти к содержанию

Урок 4 — Основы динамики полета

1. Введение в динамику полета

Динамика полета – это раздел аэромеханики, который изучает движение летательного аппарата в пространстве под действием аэродинамических сил, силы тяги, силы тяжести и управляющих воздействий. Она объясняет, почему самолет летит именно так, а не иначе, и как им можно управлять.

Для анализа движения ЛА вводятся две основные системы координат:

  1. Земная (нормальная) система координат: Связана с Землей, используется для определения положения и траектории ЛА.
  2. Связанная система координат: Жестко связана с самим летательным аппаратом. Ее оси направлены вдоль его конструктивных осей:
    • Продольная ось (Ox): Направлена от хвоста к носу. Вращение вокруг нее называется крен (roll).
    • Поперечная ось (Oy): Направлена вдоль размаха крыла. Вращение вокруг нее называется тангаж (pitch).
    • Вертикальная ось (Oz): Направлена перпендикулярно первым двум. Вращение вокруг нее называется рыскание (yaw).

2. Силы, действующие на летательный аппарат

Движение ЛА определяется балансом четырех основных сил:

  • Сила тяжести (Weight): Всегда направлена вертикально вниз к центру Земли.
  • Подъемная сила (Lift): Создается крылом и направлена перпендикулярно вектору скорости набегающего потока. Компенсирует силу тяжести.
  • Сила лобового сопротивления (Drag): Направлена против движения. Препятствует движению ЛА.
  • Сила тяги (Thrust): Создается силовой установкой (двигателями) и направлена вперед, преодолевая лобовое сопротивление.

В прямолинейном горизонтальном полете с постоянной скоростью подъемная сила равна силе тяжести, а сила тяги равна силе лобового сопротивления.

3. Уравнения движения

Движение летательного аппарата как твердого тела описывается системой из шести нелинейных дифференциальных уравнений. Три из них описывают поступательное движение центра масс, а три других – вращательное движение вокруг центра масс.

Эти уравнения очень сложны для анализа, поэтому на практике их линеаризуют для малых отклонений от некоторого установившегося режима полета (например, прямолинейного горизонтального). Это позволяет разделить сложное движение на более простые составляющие – продольное и боковое движение.

4. Динамическая устойчивость и ее моды

Как мы уже знаем, динамическая устойчивость характеризует процесс возврата ЛА к равновесию. При анализе линеаризованных уравнений движения выявляются характерные типы колебаний, называемые модами устойчивости.

4.1. Моды продольного движения

  1. Короткопериодическая мода (Short-period): Это быстрые, обычно сильно затухающие колебания угла атаки и угла тангажа при практически постоянной скорости полета. Пилот ощущает это как "клевки" носом самолета. Для хорошей управляемости эти колебания должны быстро затухать.
  2. Длиннопериодическая мода (Phugoid): Это очень медленные, слабо затухающие (иногда слабо нарастающие) колебания высоты и скорости полета при почти постоянном угле атаки. Пилот легко парирует эти колебания, и они не считаются критичными для безопасности.

4.2. Моды бокового движения

  1. "Голландский шаг" (Dutch Roll): Это связанные колебания по курсу (рыскание) и крену. Самолет одновременно виляет носом из стороны в сторону и покачивается с крыла на крыло. Эта мода может быть неприятной для пассажиров, поэтому в современных самолетах она демпфируется автоматами (демпферы рыскания).
  2. Спиральная мода (Spiral Mode): Это медленное, апериодическое (неколебательное) движение. При спиральной неустойчивости самолет, войдя в небольшой крен, начинает медленно его увеличивать, входя в спираль. Пилот легко это исправляет, но если за самолетом не следить, он может уйти в крутую спираль.
  3. Апериодическая мода крена (Roll Subsidence): Это не колебание, а просто показатель того, как быстро затухает вращение по крену после отклонения элеронов. Чем быстрее затухает, тем четче самолет реагирует на управление по крену.

5. Ссылки на материалы

  1. Динамика полёта // Википедия. – URL: https://ru.wikipedia.org/wiki/Динамика_полёта
  2. Основы динамики полета самолета // МФТИ. – URL: https://oat.mai.ru/book/glava06/6_1/6_1.htm
  3. Балакин В.Л. Динамика полета самолета: Расчет траекторий и летных характеристик. – Самара: СГАУ, 2002. – URL: https://repo.ssau.ru/bitstream/Uchebnye-izdaniya/Dinamika-poleta-samoleta-Raschet-traektorii-i-letnyh-harakteristik-konspekt-lekcii-Tekst-elektronnyi-85702/1/Балакин%20В.Л.%20Динамика%20полета%202002.pdf

6. Практический пример на Python

Смоделируем упрощенную динамику продольного движения самолета и проанализируем различные моды устойчивости.

import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
from scipy.linalg import eigvals
import cmath

def aircraft_longitudinal_model():
    """
    Упрощенная модель продольного движения легкого самолета
    Переменные состояния: [u, w, q, theta]
    u - продольная скорость
    w - вертикальная скорость  
    q - угловая скорость тангажа
    theta - угол тангажа
    """

    # Аэродинамические производные (типичные для легкого самолета)
    # Размерности приведены к безразмерному виду

    A = np.array([
        [-0.045,  0.036,  0.0,   -9.81],  # уравнение для u
        [-0.369, -2.02,   1.76,   0.0],   # уравнение для w  
        [ 0.191, -3.96,  -2.98,   0.0],   # уравнение для q
        [ 0.0,    0.0,    1.0,    0.0]    # уравнение для theta
    ])

    # Управление - отклонение руля высоты
    B = np.array([
        [ 0.0],      # влияние на u
        [-0.282],    # влияние на w
        [-9.72],     # влияние на q  
        [ 0.0]       # влияние на theta
    ])

    # Выходы - измеряемые величины
    C = np.array([
        [1, 0, 0, 0],    # продольная скорость
        [0, 0, 1, 0],    # угловая скорость тангажа
        [0, 0, 0, 1]     # угол тангажа
    ])

    D = np.zeros((3, 1))

    return A, B, C, D

def analyze_flight_modes(A):
    """Анализ мод продольного движения"""

    print("АНАЛИЗ МОД ПРОДОЛЬНОГО ДВИЖЕНИЯ САМОЛЕТА")
    print("="*60)

    # Вычисление собственных чисел
    eigenvals = eigvals(A)

    print("Собственные числа системы:")
    modes = []

    for i, lam in enumerate(eigenvals):
        real_part = np.real(lam)
        imag_part = np.imag(lam)

        if abs(imag_part) < 1e-6:  # действительное число
            print(f"λ_{i+1} = {real_part:.4f} (действительный корень)")
            modes.append(('real', real_part, 0))
        else:
            # Комплексно-сопряженная пара
            freq = abs(imag_part)
            damping = -real_part
            damping_ratio = damping / np.sqrt(real_part**2 + imag_part**2)
            period = 2*np.pi / freq if freq > 0 else np.inf

            print(f"λ_{i+1} = {real_part:.4f} ± {abs(imag_part):.4f}j")
            print(f"   Частота: {freq:.4f} рад/с")
            print(f"   Период: {period:.2f} с")
            print(f"   Коэффициент демпфирования: {damping_ratio:.4f}")

            modes.append(('complex', real_part, imag_part, freq, period, damping_ratio))

    # Классификация мод
    print("\nКЛАССИФИКАЦИЯ МОД:")

    for i, mode in enumerate(modes):
        if mode[0] == 'real':
            real_part = mode[1]
            if abs(real_part) < 0.1:
                print(f"Мода {i+1}: Медленная апериодическая (возможно, фугоидная)")
            else:
                print(f"Мода {i+1}: Быстрая апериодическая")
        else:
            freq = mode[3]
            period = mode[4]
            damping_ratio = mode[5]

            if period > 10:
                print(f"Мода {i+1}: Длиннопериодическая (фугоидная)")
                print(f"   - Медленные колебания высоты и скорости")
                print(f"   - Период: {period:.1f} с")
            elif period < 5:
                print(f"Мода {i+1}: Короткопериодическая")
                print(f"   - Быстрые колебания угла атаки и тангажа")
                print(f"   - Период: {period:.1f} с")

            if damping_ratio > 0.7:
                print(f"   - Хорошо задемпфирована")
            elif damping_ratio > 0.3:
                print(f"   - Умеренно задемпфирована")
            else:
                print(f"   - Слабо задемпфирована")

    return eigenvals, modes

def plot_mode_analysis(eigenvals, A, B, C, D):
    """Построение графиков анализа мод"""

    # Создание системы
    sys = ctrl.ss(A, B, C, D)

    fig, axes = plt.subplots(2, 2, figsize=(15, 10))

    # 1. Карта полюсов
    axes[0, 0].set_title('Карта полюсов')
    for lam in eigenvals:
        axes[0, 0].plot(np.real(lam), np.imag(lam), 'rx', markersize=10, markeredgewidth=2)

    axes[0, 0].axvline(x=0, color='k', linestyle='--', alpha=0.5, label='Граница устойчивости')
    axes[0, 0].axvspan(-10, 0, alpha=0.2, color='green', label='Область устойчивости')
    axes[0, 0].grid(True, alpha=0.3)
    axes[0, 0].set_xlabel('Действительная часть')
    axes[0, 0].set_ylabel('Мнимая часть')
    axes[0, 0].legend()

    # 2. Переходные процессы по каналам
    t = np.linspace(0, 30, 1000)

    try:
        # Реакция на ступенчатое отклонение руля высоты
        t_step, y_step = ctrl.step_response(sys, t)

        # Продольная скорость
        axes[0, 1].plot(t_step, y_step[0], label='u (продольная скорость)')
        axes[0, 1].set_title('Реакция на отклонение руля высоты')
        axes[0, 1].set_xlabel('Время (с)')
        axes[0, 1].set_ylabel('Продольная скорость')
        axes[0, 1].grid(True)

        # Угловая скорость тангажа
        axes[1, 0].plot(t_step, y_step[1], label='q (угловая скорость)', color='orange')
        axes[1, 0].set_title('Угловая скорость тангажа')
        axes[1, 0].set_xlabel('Время (с)')
        axes[1, 0].set_ylabel('q (рад/с)')
        axes[1, 0].grid(True)

        # Угол тангажа
        axes[1, 1].plot(t_step, y_step[2], label='θ (угол тангажа)', color='green')
        axes[1, 1].set_title('Угол тангажа')
        axes[1, 1].set_xlabel('Время (с)')
        axes[1, 1].set_ylabel('θ (рад)')
        axes[1, 1].grid(True)

    except Exception as e:
        print(f"Ошибка при построении переходных процессов: {e}")

    plt.tight_layout()
    plt.show()

def simulate_flight_disturbance():
    """Моделирование реакции на возмущение (порыв ветра)"""

    A, B, C, D = aircraft_longitudinal_model()

    # Создание системы
    sys = ctrl.ss(A, B, C, D)

    # Моделирование порыва ветра как импульсного возмущения
    t = np.linspace(0, 20, 1000)

    # Импульсное возмущение в момент t=1с
    u = np.zeros_like(t)
    disturbance_idx = np.where(t >= 1.0)[0][0]
    u[disturbance_idx:disturbance_idx+10] = 0.1  # кратковременное отклонение руля

    # Моделирование отклика системы
    t_sim, y_sim, x_sim = ctrl.lsim(sys, u, t, return_x=True)

    plt.figure(figsize=(15, 8))

    # Переменные состояния
    plt.subplot(2, 3, 1)
    plt.plot(t_sim, x_sim[:, 0])
    plt.title('Продольная скорость u')
    plt.xlabel('Время (с)')
    plt.ylabel('u (м/с)')
    plt.grid(True)

    plt.subplot(2, 3, 2)
    plt.plot(t_sim, x_sim[:, 1])
    plt.title('Вертикальная скорость w')
    plt.xlabel('Время (с)')
    plt.ylabel('w (м/с)')
    plt.grid(True)

    plt.subplot(2, 3, 3)
    plt.plot(t_sim, x_sim[:, 2])
    plt.title('Угловая скорость тангажа q')
    plt.xlabel('Время (с)')
    plt.ylabel('q (рад/с)')
    plt.grid(True)

    plt.subplot(2, 3, 4)
    plt.plot(t_sim, x_sim[:, 3])
    plt.title('Угол тангажа θ')
    plt.xlabel('Время (с)')
    plt.ylabel('θ (рад)')
    plt.grid(True)

    plt.subplot(2, 3, 5)
    plt.plot(t_sim, u)
    plt.title('Управляющее воздействие')
    plt.xlabel('Время (с)')
    plt.ylabel('δe (рад)')
    plt.grid(True)

    # Фазовый портрет (угол атаки vs угловая скорость)
    plt.subplot(2, 3, 6)
    alpha = np.arctan(x_sim[:, 1] / (x_sim[:, 0] + 1e-6))  # приближенный угол атаки
    plt.plot(alpha, x_sim[:, 2])
    plt.title('Фазовый портрет (α vs q)')
    plt.xlabel('Угол атаки α (рад)')
    plt.ylabel('Угловая скорость q (рад/с)')
    plt.grid(True)

    plt.tight_layout()
    plt.show()

# Основная программа
if __name__ == "__main__":
    # Получение модели самолета
    A, B, C, D = aircraft_longitudinal_model()

    print("МОДЕЛЬ ПРОДОЛЬНОГО ДВИЖЕНИЯ САМОЛЕТА")
    print("="*50)
    print("Переменные состояния: [u, w, q, θ]")
    print("u - продольная скорость")
    print("w - вертикальная скорость")  
    print("q - угловая скорость тангажа")
    print("θ - угол тангажа")
    print()
    print("Матрица A:")
    print(A)
    print("\nМатрица B:")
    print(B)
    print("\nМатрица C:")
    print(C)

    # Анализ мод
    eigenvals, modes = analyze_flight_modes(A)

    # Проверка устойчивости
    print(f"\n{'='*60}")
    print("ОЦЕНКА УСТОЙЧИВОСТИ")
    print(f"{'='*60}")

    stable = all(np.real(lam) < 0 for lam in eigenvals)
    if stable:
        print("✓ Самолет статически и динамически устойчив")
    else:
        print("✗ Самолет неустойчив")

    # Построение графиков
    plot_mode_analysis(eigenvals, A, B, C, D)

    # Моделирование возмущения
    print("\nМоделирование реакции на возмущение...")
    simulate_flight_disturbance()

Этот пример демонстрирует:

  1. Модель продольного движения самолета в пространстве состояний с реалистичными аэродинамическими коэффициентами
  2. Анализ мод устойчивости - автоматическое определение короткопериодических и длиннопериодических мод
  3. Классификацию динамических характеристик по периоду колебаний и коэффициенту демпфирования
  4. Визуализацию полюсов и переходных процессов для различных каналов управления
  5. Моделирование реакции на возмущения (например, порывы ветра) с построением фазовых портретов