Обратная связь по состоянию и размещение полюсов

Управляем не по ошибке выхода, а по всему вектору состояния.

Обратная связь по состоянию формирует воздействие из всего вектора состояния: $u = -K \cdot x$. Подбирая $K$, можно разместить полюса замкнутой системы там, где мы хотим.

Идея управления по состоянию

ПИД смотрит только на ошибку выхода. Но если мы знаем весь вектор состояния (например, и позицию, и скорость), можно управлять умнее — учитывать всё сразу. Обратная связь по состоянию задаёт воздействие как $u = -K \cdot x$, где $K$ — строка коэффициентов усиления по каждому состоянию. Для массы-пружины это $u = -(k_1 \cdot \text{позиция} + k_2 \cdot \text{скорость})$: первый коэффициент тянет к нулю позицию, второй гасит скорость (демпфирование). По сути это обобщение ПД-регулятора на произвольные системы.

Размещение полюсов

Главная сила метода: подбором $K$ можно поставить полюса замкнутой системы в любые желаемые места (если система управляема). Хотим быстрый отклик без колебаний — выбираем полюса далеко слева на действительной оси и вычисляем $K$, дающий именно их. Это называется размещение полюсов (pole placement). Вместо «крутить коэффициенты на ощупь» мы прямо задаём желаемую динамику. Расчёт $K$ по заданным полюсам делают формулой Аккермана или численно — мы рассмотрим идею обзорно.

Как работает под капотом: гасим колебания по состоянию

Возьмём массу-пружину без демпфера (она бы колебалась вечно) и стабилизируем её обратной связью по состоянию. Коэффициенты $K$ подобраны так, чтобы система быстро и без раскачки пришла в ноль.

m, kc = 1.0, 4.0
A = [[0.0, 1.0], [-kc/m, 0.0]]    # демпфера нет -> чистые колебания
B = [0.0, 1.0/m]
K = [6.0, 5.0]                    # обратная связь u = -(K0*x + K1*v)
dt = 0.05
x = [1.0, 0.0]                    # стартовое отклонение: позиция=1

print(" t   позиция   скорость   u")
for step in range(0, 61):
    u = -(K[0]*x[0] + K[1]*x[1])
    if step % 6 == 0:
        print(f"{step*dt:4.2f}  {x[0]:7.3f}  {x[1]:8.3f}  {u:7.2f}")
    dx0 = A[0][0]*x[0] + A[0][1]*x[1] + B[0]*u
    dx1 = A[1][0]*x[0] + A[1][1]*x[1] + B[1]*u
    x[0] += dx0*dt; x[1] += dx1*dt
print("система пришла в ноль без вечных колебаний")

Вывод:

 t   позиция   скорость   u
0.00    1.000     0.000    -6.00
0.30    0.736    -1.476     2.96
0.60    0.324    -1.085     3.48
0.90    0.079    -0.477     1.91
1.20   -0.012    -0.116     0.65
1.50   -0.026     0.018     0.06
1.80   -0.017     0.039    -0.09
2.10   -0.006     0.024    -0.08
2.40   -0.001     0.010    -0.04
2.70    0.001     0.002    -0.01
3.00    0.001    -0.001     0.00
система пришла в ноль без вечных колебаний

Без обратной связи эта система колебалась бы бесконечно (нет демпфера). Обратная связь по состоянию $u = -K \cdot x$ создала искусственное демпфирование и притянула систему в ноль. Меняя $K$, мы напрямую управляем тем, насколько быстро и плавно это произойдёт — это и есть размещение полюсов в действии.

Управляемость

Не любую систему можно стабилизировать обратной связью по состоянию. Свойство управляемости (controllability) говорит, можем ли мы воздействием $u$ дотянуться до всех состояний. Если какое-то состояние «оторвано» от входа, разместить его полюс мы не сможем. Управляемость проверяют по специальной матрице (Калмана) — но идея проста: вход должен влиять, прямо или косвенно, на каждое состояние.

Добавляем интегральное действие

У чистой обратной связи по состоянию $u = -Kx$ есть та же слабость, что у P-регулятора: при постоянном возмущении остаётся статическая ошибка. Лекарство то же — интеграл. К вектору состояния добавляют новое искусственное состояние — интеграл ошибки слежения, и размещают полюса уже расширенной системы. Получается обратная связь по состоянию с интегральным действием, которая и быстра (благодаря размещению полюсов), и точна (благодаря интегралу). Это прямое обобщение ПИД на многомерные системы и стандартный приём в современном проектировании: сначала строим обратную связь по состоянию для нужной динамики, затем достраиваем интегратор для нулевой установившейся ошибки. Так классическая ПИД-интуиция переносится в матричный мир.

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

  • Применять $u=-Kx$, не зная состояния. Метод требует знать ВЕСЬ вектор состояния; если что-то не измеряется, нужен наблюдатель (следующий раздел).
  • Ставить полюса слишком далеко влево. Очень быстрый отклик требует огромного воздействия — привод насытится.
  • Игнорировать управляемость. Для неуправляемой системы размещение полюсов невозможно в принципе.

Итоги

  • Обратная связь по состоянию: $u=-K \cdot x$ — воздействие из всего вектора состояния.
  • Подбором $K$ размещают полюса замкнутой системы в желаемых местах (pole placement).
  • Метод требует знать всё состояние и управляемости системы.
Проверьте себя
1. Что задаёт закон обратной связи по состоянию?
Au = Kp·e
Bu = -K·x (воздействие из всего вектора состояния)
Cu = Ki·∫e
Du = const
2. Что такое размещение полюсов (pole placement)?
AСлучайный подбор K
BВыбор K так, чтобы полюса замкнутой системы оказались в заданных местах
CИзмерение полюсов датчиком
DУдаление полюсов из системы
3. Что означает управляемость системы?
AНаличие датчика
BВозможность входом u дотянуться до всех состояний
CОтсутствие возмущений
DЛинейность объекта
py
Курс по теме
Пройдите курс «Python с нуля» — по шагам, с проверкой
8 уроков · ~14 ч · теория, упражнения и экзамен с бейджем
Открыть курс →