Урок 2 — Управляемость и наблюдаемость¶
1. Введение в оценку систем управления¶
После того как мы научились представлять динамические системы в пространстве состояний, возникает два фундаментальных вопроса:
- Управляемость: Можем ли мы перевести систему из любого начального состояния в любое конечное состояние за конечное время, используя доступные нам управляющие воздействия?
- Наблюдаемость: Можем ли мы определить внутреннее состояние системы, наблюдая только за ее выходными сигналами?
Эти два понятия, управляемость и наблюдаемость, являются ключевыми для анализа и синтеза систем управления. Они определяют, насколько хорошо мы можем контролировать и отслеживать поведение системы. Впервые эти концепции были введены Рудольфом Калманом.
2. Управляемость (Controllability)¶
Определение: Система называется полностью управляемой, если существует такое неограниченное управляющее воздействие u(t), которое может перевести систему из любого начального состояния x(t₀) в любое конечное состояние x(t₁) за конечный промежуток времени t₁ - t₀.
Проще говоря, управляемость означает, что мы можем "дотянуться" до любого состояния в пространстве состояний, манипулируя входами системы. Если система неуправляема, то существуют такие состояния, в которые мы никогда не сможем ее перевести, как бы мы ни старались.
2.1. Критерий управляемости Калмана¶
Для линейных стационарных систем, описываемых уравнениями:
критерием управляемости является ранг матрицы управляемости P:
где n – размерность вектора состояния (количество переменных состояния).
Система полностью управляема тогда и только тогда, когда ранг матрицы управляемости равен размерности пространства состояний:
Если rank(P) < n, то система является неуправляемой. Это означает, что существуют "недостижимые" подпространства в пространстве состояний.
3. Наблюдаемость (Observability)¶
Определение: Система называется полностью наблюдаемой, если по известным входным сигналам u(t) и выходным сигналам y(t) за конечный промежуток времени t₁ - t₀ можно однозначно определить начальное состояние системы x(t₀).
Наблюдаемость показывает, можем ли мы, глядя на "поведение" системы снаружи (на ее выходы), понять, что происходит у нее "внутри" (каково ее состояние). Если система ненаблюдаема, то существуют такие внутренние состояния, которые никак не проявляются на выходе, и мы не можем их различить.
3.1. Критерий наблюдаемости Калмана¶
Для линейных стационарных систем, описываемых уравнениями:
критерием наблюдаемости является ранг матрицы наблюдаемости Q:
Система полностью наблюдаема тогда и только тогда, когда ранг матрицы наблюдаемости равен размерности пространства состояний:
Если rank(Q) < n, то система является ненаблюдаемой.
4. Принцип дуальности¶
Существует важная связь между управляемостью и наблюдаемостью, известная как принцип дуальности. Он гласит, что система (A, B) управляема тогда и только тогда, когда дуальная ей система (Aᵀ, Cᵀ) наблюдаема, и наоборот.
Это означает, что математические методы для проверки управляемости и наблюдаемости очень похожи.
5. Ссылки на материалы¶
- Наблюдаемость (теория управления) // Википедия. – URL: https://ru.wikipedia.org/wiki/Наблюдаемость_(теория_управления)
- Управляемость и наблюдаемость // Studfile. – URL: https://studfile.net/preview/2202942/page:8/
- Controllability and Observability // Rutgers ECE. – URL: http://eceweb1.rutgers.edu/~gajic/psfiles/chap5traCO.pdf
6. Практический пример на Python¶
Проверим управляемость и наблюдаемость системы из первого семинара и рассмотрим случаи неуправляемых и ненаблюдаемых систем.
import numpy as np
import control as ctrl
from scipy.linalg import matrix_rank
def check_controllability(A, B):
"""Проверка управляемости системы"""
n = A.shape[0] # размерность системы
# Построение матрицы управляемости P = [B, AB, A²B, ..., A^(n-1)B]
P = B.copy()
AB = A @ B
for i in range(1, n):
P = np.hstack([P, AB])
AB = A @ AB
rank_P = matrix_rank(P)
print(f"Матрица управляемости P:")
print(P)
print(f"Ранг матрицы управляемости: {rank_P}")
print(f"Размерность системы: {n}")
if rank_P == n:
print("✓ Система ПОЛНОСТЬЮ УПРАВЛЯЕМА")
return True
else:
print("✗ Система НЕ ПОЛНОСТЬЮ УПРАВЛЯЕМА")
return False
def check_observability(A, C):
"""Проверка наблюдаемости системы"""
n = A.shape[0] # размерность системы
# Построение матрицы наблюдаемости Q = [C; CA; CA²; ...; CA^(n-1)]
Q = C.copy()
CA = C @ A
for i in range(1, n):
Q = np.vstack([Q, CA])
CA = CA @ A
rank_Q = matrix_rank(Q)
print(f"Матрица наблюдаемости Q:")
print(Q)
print(f"Ранг матрицы наблюдаемости: {rank_Q}")
print(f"Размерность системы: {n}")
if rank_Q == n:
print("✓ Система ПОЛНОСТЬЮ НАБЛЮДАЕМА")
return True
else:
print("✗ Система НЕ ПОЛНОСТЬЮ НАБЛЮДАЕМА")
return False
# Пример 1: Управляемая и наблюдаемая система (масса-пружина-демпфер)
print("=" * 60)
print("ПРИМЕР 1: Управляемая и наблюдаемая система")
print("=" * 60)
A1 = np.array([[0, 1],
[-4, -1]])
B1 = np.array([[0],
[1]])
C1 = np.array([[1, 0]]) # измеряем положение
print("Система 1:")
print(f"A = \n{A1}")
print(f"B = \n{B1}")
print(f"C = \n{C1}")
print()
controllable1 = check_controllability(A1, B1)
print()
observable1 = check_observability(A1, C1)
# Пример 2: Неуправляемая система
print("\n" + "=" * 60)
print("ПРИМЕР 2: Неуправляемая система")
print("=" * 60)
# Система с блочно-диагональной структурой
A2 = np.array([[0, 1, 0],
[-2, -1, 0],
[0, 0, -3]])
B2 = np.array([[0],
[1],
[0]]) # управление не влияет на третье состояние
C2 = np.array([[1, 0, 1]])
print("Система 2:")
print(f"A = \n{A2}")
print(f"B = \n{B2}")
print(f"C = \n{C2}")
print()
controllable2 = check_controllability(A2, B2)
print()
observable2 = check_observability(A2, C2)
# Пример 3: Ненаблюдаемая система
print("\n" + "=" * 60)
print("ПРИМЕР 3: Ненаблюдаемая система")
print("=" * 60)
A3 = np.array([[0, 1],
[-4, -1]])
B3 = np.array([[0],
[1]])
C3 = np.array([[0, 1]]) # измеряем только скорость, но не положение
print("Система 3:")
print(f"A = \n{A3}")
print(f"B = \n{B3}")
print(f"C = \n{C3}")
print()
controllable3 = check_controllability(A3, B3)
print()
observable3 = check_observability(A3, C3)
# Использование встроенных функций библиотеки control
print("\n" + "=" * 60)
print("ПРОВЕРКА С ПОМОЩЬЮ БИБЛИОТЕКИ CONTROL")
print("=" * 60)
# Создание систем
sys1 = ctrl.ss(A1, B1, C1, 0)
sys2 = ctrl.ss(A2, B2, C2, 0)
sys3 = ctrl.ss(A3, B3, C3, 0)
# Проверка с помощью встроенных функций
print("Система 1:")
print(f"Управляемость: {ctrl.ctrb(A1, B1).shape[1] == matrix_rank(ctrl.ctrb(A1, B1)) == A1.shape[0]}")
print(f"Наблюдаемость: {ctrl.obsv(A1, C1).shape[0] == matrix_rank(ctrl.obsv(A1, C1)) == A1.shape[0]}")
print("\nСистема 2:")
print(f"Управляемость: {ctrl.ctrb(A2, B2).shape[1] == matrix_rank(ctrl.ctrb(A2, B2)) == A2.shape[0]}")
print(f"Наблюдаемость: {ctrl.obsv(A2, C2).shape[0] == matrix_rank(ctrl.obsv(A2, C2)) == A2.shape[0]}")
print("\nСистема 3:")
print(f"Управляемость: {ctrl.ctrb(A3, B3).shape[1] == matrix_rank(ctrl.ctrb(A3, B3)) == A3.shape[0]}")
print(f"Наблюдаемость: {ctrl.obsv(A3, C3).shape[0] == matrix_rank(ctrl.obsv(A3, C3)) == A3.shape[0]}")
# Демонстрация принципа дуальности
print("\n" + "=" * 60)
print("ДЕМОНСТРАЦИЯ ПРИНЦИПА ДУАЛЬНОСТИ")
print("=" * 60)
# Если система (A, B) управляема, то дуальная система (A^T, C^T) наблюдаема
A_dual = A1.T
C_dual = B1.T
print("Исходная система (A1, B1):")
print(f"Управляемость: {check_controllability(A1, B1)}")
print("\nДуальная система (A1^T, B1^T):")
print(f"Наблюдаемость: {check_observability(A_dual, C_dual)}")
Этот пример демонстрирует:
- Алгоритм проверки управляемости через построение и анализ ранга матрицы управляемости
- Алгоритм проверки наблюдаемости через построение и анализ ранга матрицы наблюдаемости
- Примеры различных типов систем: полностью управляемых/наблюдаемых, неуправляемых и ненаблюдаемых
- Использование встроенных функций библиотеки
controlдля проверки - Демонстрацию принципа дуальности между управляемостью и наблюдаемостью