Пространство состояний: вектор x и матрицы A, B, C, D

Современный взгляд на системы: описываем их вектором состояния и матрицами.

Пространство состояний (state-space) — способ описать систему через вектор состояния x и четыре матрицы A, B, C, D, связывающие вход, состояние и выход.

Зачем нужен ещё один подход

Передаточные функции прекрасны для одного входа и одного выхода. Но современные системы — дрон, ракета, робот-манипулятор — имеют много входов и выходов и сложно связанные состояния. Описывать их дробями неудобно. Пространство состояний — это компактный матричный язык, который одинаково естественно работает с системами любого размера и лёг в основу всей современной теории управления (Калман, LQR, оптимальное и адаптивное управление). Это шаг от классики (Огата, Дорф) к современному подходу.

Вектор состояния и четыре матрицы

Вместо одного выхода вводят вектор состояния x — список всех величин, полностью описывающих систему в данный момент. Для массы-пружины это x = [позиция, скорость]. Динамика записывается двумя уравнениями:

x’ = A·x + B·u      (как меняется состояние)
y  = C·x + D·u      (как из состояния получается выход)
МатрицаСмысл
A (система)как состояние влияет само на себя — внутренняя динамика
B (вход)как вход u воздействует на состояние
C (выход)как из состояния получается измеряемый выход
D (прямая связь)как вход напрямую попадает в выход (часто 0)

Как работает под капотом: масса-пружина в state-space

Запишем массу-пружину-демпфер в форме состояния. Состояние [x, v], вход — сила u. Из m·x'' = u - b·v - kс·x получаем A = [[0,1],[-kс/m, -b/m]], B = [0, 1/m], C = [1, 0] (измеряем позицию). Симулируем матричное уравнение явным Эйлером — без всяких библиотек, просто перемножая списки.

# x' = A x + B u, y = C x  (масса-пружина-демпфер)
m, b, kc = 1.0, 0.6, 3.0
A = [[0.0, 1.0], [-kc/m, -b/m]]
B = [0.0, 1.0/m]
C = [1.0, 0.0]
dt, u = 0.1, 3.0          # ступенчатая сила
x = [0.0, 0.0]            # вектор состояния [позиция, скорость]

print(" t   позиция(y)  скорость")
for step in range(0, 51):
    if step % 5 == 0:
        y = C[0]*x[0] + C[1]*x[1]
        print(f"{step*dt:4.1f}   {y:7.3f}   {x[1]:7.3f}")
    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(f"устоявшаяся позиция = {u/kc:.3f}")

Вывод:

 t   позиция(y)  скорость
 0.0     0.000     0.000
 0.5     0.278     1.246
 1.0     0.996     1.488
 1.5     1.616     0.708
 2.0     1.738    -0.433
 2.5     1.353    -1.125
 3.0     0.788    -0.972
 3.5     0.443    -0.195
 4.0     0.517     0.601
 4.5     0.901     0.886
 5.0     1.297     0.542
устоявшаяся позиция = 1.000

Та же масса-пружина, что и раньше, но записанная единообразно через матрицы. Прелесть в том, что этот код не изменится для системы из 10 состояний — поменяются лишь размеры матриц. Именно эта масштабируемость делает пространство состояний мощнее передаточных функций для сложных систем.

Связь с полюсами

Между подходами есть мост: полюса системы — это собственные значения матрицы A. Устойчивость в state-space читается так же: система устойчива, если все собственные значения A имеют отрицательную действительную часть (лежат в левой полуплоскости). Так классический критерий полюсов переносится на матричный язык.

Преимущества перед передаточными функциями

Почему пространство состояний называют «современной» теорией, а передаточные функции — «классической»? Передаточная функция связывает один вход с одним выходом и прячет внутренние состояния. Пространство состояний делает их явными и работает с любым числом входов и выходов единообразно — а именно такие многомерные связанные системы (MIMO) и есть реальные дроны, роботы, самолёты, где рули, моторы и оси влияют друг на друга. Кроме того, на матричном языке элегантно формулируются мощные результаты: оптимальное управление (LQR), оптимальное оценивание (фильтр Калмана), управляемость и наблюдаемость. Передаточные функции остаются удобными для интуиции и простых одномерных контуров, но как только система становится сложной и связанной, инженеры переходят на язык состояний.

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

  • Путать состояние и выход. Состояние — полное внутреннее описание; выход — лишь то, что измеряем (через C). Их размерности часто разные.
  • Забыть, что порядок системы = размер вектора состояния. Масса-пружина второго порядка — это два состояния, а не одно.
  • Думать, что state-space сложнее. Для симуляции это просто перемножение матриц; концептуально часто яснее, чем дроби.

Итоги

  • Пространство состояний описывает систему вектором x и матрицами A, B, C, D.
  • x'=Ax+Bu задаёт динамику, y=Cx+Du — выход; подход масштабируется на много входов/выходов.
  • Полюса = собственные значения A; устойчивость — все они в левой полуплоскости.
Проверьте себя
1. Что описывает вектор состояния x в пространстве состояний?
AТолько измеряемый выход
BВсе величины, полностью описывающие систему в данный момент
CКоэффициенты регулятора
DУставку
2. За что отвечает матрица A?
AЗа влияние входа на состояние
BЗа внутреннюю динамику: как состояние влияет само на себя
CЗа измерение выхода
DЗа прямую связь входа с выходом
3. Как связаны полюса и матрица A?
AНикак
BПолюса — это собственные значения матрицы A
CПолюса — это элементы матрицы B
DПолюса равны следу A