Оптимальное управление: идея LQR

Когда вместо ручного подбора K используют оптимальный критерий: идея LQR.

LQR (Linear-Quadratic Regulator) — метод, который вычисляет оптимальную обратную связь по состоянию, минимизируя баланс между ошибкой и затратами на управление.

Проблема ручного выбора полюсов

Размещение полюсов мощно, но где именно ставить полюса для сложной системы — неочевидно. Поставишь слишком быстро — привод перегрузится; слишком медленно — система вялая. Хочется, чтобы компьютер сам нашёл компромисс. Именно это делает LQR — оптимальное управление, одна из жемчужин современной теории.

Идея: штрафуем ошибку и усилие

LQR формулирует управление как задачу минимизации. Мы задаём функционал стоимости (cost): штраф за отклонение состояния от нуля плюс штраф за величину воздействия. В виде интеграла по времени:

$$J = \int_0^\infty (x^T Q x + u^T R u)\, dt$$

Матрица $Q$ говорит, насколько важно держать каждое состояние близко к цели; $R$ — насколько дорого «жать на газ». LQR находит обратную связь $u = -K \cdot x$, которая минимизирует этот баланс. Хотим точнее — увеличиваем $Q$; хотим экономнее расходовать привод — увеличиваем $R$.

КрутимЭффект
больше $Q$агрессивнее держим состояние у цели (быстрее, но дороже по усилию)
больше $R$экономим привод (плавнее, мягче, но медленнее)

Как работает под капотом: эффект штрафов на качество

Точный расчёт $K$ для LQR требует решения уравнения Риккати (вне stdlib). Но мы можем показать смысл штрафов: сравним два готовых $K$ — «дорогое управление» (бережём привод, большое $R$) и «точное управление» (бережём состояние, большое $Q$) — на той же массе-пружине и посмотрим на компромисс «скорость против усилия».

def run(K, label):
    m, kc, dt = 1.0, 4.0, 0.05
    A = [[0.0,1.0],[-kc/m, 0.0]]; B=[0.0,1.0/m]
    x = [1.0, 0.0]
    effort, t_settle = 0.0, 0.0
    for step in range(400):
        u = -(K[0]*x[0] + K[1]*x[1])
        effort += abs(u)*dt
        dx0 = x[1]; dx1 = A[1][0]*x[0] + B[1]*u
        x[0]+=dx0*dt; x[1]+=dx1*dt
        if abs(x[0]) > 0.02 or abs(x[1]) > 0.02:
            t_settle = (step+1)*dt
    print(f"{label}: t_settle={t_settle:.2f}c, суммарное усилие={effort:.2f}")

run([2.0, 2.5], "мягкое (большое R, бережём привод)")
run([10.0, 6.0], "точное (большое Q, бережём состояние)")

Вывод:

мягкое (большое R, бережём привод): t_settle=3.85c, суммарное усилие=2.95
точное (большое Q, бережём состояние): t_settle=1.85c, суммарное усилие=3.68

Видно компромисс, который и оптимизирует LQR: «точная» настройка успокаивает систему быстрее, но тратит больше усилия привода; «мягкая» экономит привод ценой скорости. LQR автоматически находит оптимальную точку между этими крайностями для заданных $Q$ и $R$. В реальных проектах $K$ считают библиотеки (python-control, MATLAB), а инженер лишь крутит $Q$ и $R$ — это куда удобнее, чем подбирать полюса вручную.

Где применяют LQR

LQR — рабочий инструмент в аэрокосмосе и робототехнике: стабилизация ракет и спутников, балансировка перевёрнутого маятника и шагающих роботов, управление квадрокоптерами. Везде, где много связанных состояний и важен баланс точность/расход, LQR даёт системный способ получить хорошую обратную связь. Его расширение с учётом шума — это связка LQR + фильтр Калмана (LQG), о котором — в следующем разделе.

От LQR к LQG и MPC

LQR — это вершина линейно-квадратичной теории, но у неё есть продолжения. Если состояние известно неточно (есть шум измерения), LQR соединяют с фильтром Калмана, получая LQG (Linear-Quadratic-Gaussian) — оптимальное управление при неполной и зашумлённой информации, рабочую лошадку аэрокосмоса. Если на воздействие и состояние наложены жёсткие ограничения (привод не сильнее X, угол не больше Y), на сцену выходит MPC (Model Predictive Control): на каждом шаге решается задача оптимизации на горизонт вперёд с учётом всех ограничений, применяется первый шаг, и всё повторяется. MPC сегодня управляет нефтехимией, автопилотами и даже посадкой ракет. LQR — это фундамент, на котором стоят эти продвинутые методы, поэтому понять его идею «штрафуем ошибку и усилие» так важно.

Частые ошибки

  • Считать LQR «волшебной кнопкой». Качество зависит от выбора $Q$ и $R$; их всё равно подбирают под задачу.
  • Забыть про насыщение. LQR не знает о пределах привода; при агрессивном $Q$ расчётное усилие может быть нереализуемым.
  • Применять LQR без знания состояния. Как и любая обратная связь по состоянию, LQR требует полного вектора $x$ (или наблюдателя).

Итоги

  • LQR вычисляет оптимальную обратную связь $u=-Kx$, минимизируя баланс ошибки и усилия.
  • Матрица $Q$ штрафует отклонение состояния, $R$ — расход управления; крутят их под задачу.
  • LQR удобнее ручного размещения полюсов и широко применяется в аэрокосмосе и робототехнике.
Проверьте себя
1. Что минимизирует LQR?
AТолько ошибку состояния
BБаланс штрафов за отклонение состояния (Q) и за расход управления (R)
CТолько усилие привода
DПериод дискретизации
2. Что произойдёт, если увеличить матрицу R в LQR?
AСистема станет агрессивнее
BУправление станет экономнее и мягче (бережём привод), но медленнее
CИсчезнет статическая ошибка
DВырастет шум
3. Что нужно LQR, как и любой обратной связи по состоянию?
AТолько выход
BПолный вектор состояния x (или его оценка наблюдателем)
CПередаточная функция
DБольшой период Ts
py
Курс по теме
Пройдите курс «Python с нуля» — по шагам, с проверкой
8 уроков · ~14 ч · теория, упражнения и экзамен с бейджем
Открыть курс →