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

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

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

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

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

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

LQR формулирует управление как задачу минимизации. Мы задаём функционал стоимости (cost): штраф за отклонение состояния от нуля плюс штраф за величину воздействия. В виде суммы по времени: J = Σ (x·Q·x + u·R·u). Матрица Q говорит, насколько важно держать каждое состояние близко к цели; R — насколько дорого «жать на газ». LQR находит обратную связь u = -K·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