Аналитические и численные решения набора задач по теории оптимального управления: линейно-квадратичный регулятор (LQR), вывод уравнения Риккати из принципа максимума Понтрягина, фильтр Калмана–Бьюси, двойственность LQR↔Kalman и частотный (сингулярный) анализ замкнутой системы. Все выкладки доведены до численного эксперимента на модели двойного интегратора.
Рассматривается линейная стационарная (LTI) система с квадратичным функционалом качества
На этой общей постановке решаются пять связанных задач:
| № | Задача | Что требуется |
|---|---|---|
| 2 | LQR со свободной начальной точкой | Условие трансверсальности по свободной компоненте |
| 3 | Вывод уравнения Риккати | Получить матричное дифференциальное уравнение Риккати (DRE) из гамильтониана |
| 4 | LQR для двойного интегратора | Численно решить DRE, найти оптимальный закон, траекторию и стоимость |
| 5 | Уравнение Риккати для фильтра Калмана | Вывести фильтр Калмана–Бьюси и показать двойственность с LQR |
| 6 | Сингулярные значения замкнутой системы | Связь |
Модель для расчётов — двойной интегратор (точечная масса под действием силы
-
Принцип Понтрягина → гамильтонова система. Из гамильтониана выписываются канонические уравнения состояние–сопряжённая переменная, минимизация
$H$ по$u$ даёт$u^* = -R^{-1}B^\top \lambda$ . -
Sweep-подстановка
$\lambda = P(t)x$ приводит к матричному дифференциальному уравнению Риккати$\dot P = -(A^\top P + PA - PBR^{-1}B^\top P + Q)$ , интегрируемому назад от$P(t_f)=F$ . -
Численное интегрирование DRE выполнено
scipy.integrate.solve_ivp(с высокой точностью), стационарное решение проверено черезsolve_continuous_are. -
Свободная начальная точка (задача 2): условие
$\lambda_1(0)=0$ даёт замкнутую формулу оптимального выбора$x_1(0)^* = -P_{12}(0),x_2(0)/P_{11}(0)$ . - Фильтр Калмана (задача 5) получен как точный дуал регулятора — основа принципа разделения в LQG.
-
Частотный анализ (задача 6): сингулярные значения передаточной матрицы
$G(j\omega)=(j\omega I-(A+BK))^{-1}B$ строятся по сетке частот.
P(0) = [[1.7318, 0.9999], [0.9999, 1.7321]]
K_ss = [1.0, 1.7321]
eig(A_cl) = -0.866 ± 0.5j (устойчиво, ζ ≈ 0.866)
J_opt = 1.7318
x1(0)* = -0.5774 → J_free = 1.1548 (против J = 1.7321 при x1(0)=0)
σ_max = 1.0 (плато на низких частотах, 0 дБ)
-
Конечный горизонт ≈ стационарный режим. Решение DRE быстро (за «пограничный слой» у
$t_f$ ) выходит на постоянное решение алгебраического уравнения Риккати, поскольку$t_f=5$ велик по сравнению с постоянной времени замкнутого контура. -
Оптимальный регулятор устойчив: полюса
$-0.866\pm0.5j$ , коэффициент демпфирования$\zeta\approx0.866$ — состояние плавно приводится к нулю. -
Свобода начальной точки снижает стоимость: оптимальный выбор
$x_1(0)^*=-0.577$ уменьшает функционал с$1.7321$ до$1.1548$ , что подтверждает корректность условия трансверсальности. - Двойственность LQR↔Kalman показана явно — управление и оценивание описываются одной и той же структурой уравнения Риккати.
-
Частотная характеристика замкнутой системы имеет вид ФНЧ: низкочастотное плато
$\sigma=1$ (0 дБ) и спад за полосой пропускания — многомерное обобщение характеристики Боде.
Optimal_Control_Report/
├── oc_solution.py # численное решение задач 2, 4, 6 и генерация графиков
├── Optimal_Control_Solutions.docx # полный отчёт с выкладками (задачи 2–6 + приложение)
├── Optimal_Control_Solutions.pdf # тот же отчёт в PDF
└── README.md
Скрипт oc_solution.py при запуске печатает численные результаты в консоль и сохраняет три рисунка:
-
fig_P.png— элементы матрицы Риккати$P(t)$ ; -
fig_xu.png— оптимальная траектория$x(t)$ и управление$u^*(t)$ ; -
fig_sigma.png— сингулярные значения$\sigma(\omega)$ замкнутой системы.
- Python 3 — язык реализации
- NumPy — линейная алгебра, матричные операции
- SciPy —
solve_ivp(интегрирование DRE и замкнутой системы),solve_continuous_are(алгебраическое уравнение Риккати) - Matplotlib — построение графиков
- Отчёт подготовлен в форматах DOCX и PDF
pip install numpy scipy matplotlib
python oc_solution.pyПосле выполнения в каталоге появятся рисунки fig_P.png, fig_xu.png, fig_sigma.png,
а числовые результаты будут выведены в консоль.