scipy.linalg.

solve_continuous_are#

scipy.linalg.solve_continuous_are(a, b, q, r, e=None, s=None, сбалансированный=True)[источник]#

Решает непрерывное алгебраическое уравнение Риккати (CARE).

CARE определяется как

\[X A + A^H X - X B R^{-1} B^H X + Q = 0\]

Ограничения для существования решения:

  • Все собственные значения \(A\) в правой полуплоскости, должно быть управляемым.

  • Соответствующий гамильтонов карандаш (см. Примечания) должен иметь собственные значения, достаточно удаленные от мнимой оси.

Более того, если e или s не является точно None, затем обобщённая версия CARE

\[E^HXA + A^HXE - (E^HXB + S) R^{-1} (B^HXE + S^H) + Q = 0\]

решается. Если опущено, e предполагается тождественной и s предполагается нулевой матрицей с размерами, совместимыми с a и b, соответственно.

Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.

Параметры:
a(M, M) array_like

Квадратная матрица

b(M, N) array_like

Вход

q(M, M) array_like

Вход

r(N, N) array_like

Невырожденная квадратная матрица

e(M, M) array_like, опционально

Невырожденная квадратная матрица

s(M, N) array_like, опционально

Вход

сбалансированныйbool, необязательно

Логическое значение, указывающее, выполняется ли шаг балансировки над данными. По умолчанию установлено в True.

Возвращает:
x(M, M) ndarray

Решение непрерывного алгебраического уравнения Риккати.

Вызывает:
LinAlgError

Для случаев, когда устойчивое подпространство карандаша не могло быть изолировано. См. раздел "Примечания" и ссылки для подробностей.

Смотрите также

solve_discrete_are

Решает дискретное алгебраическое уравнение Риккати

Примечания

Уравнение решается путём формирования расширенной матрицы-карандаша Гамильтона, как описано в [1], \(H - \lambda J\) задаётся блочными матрицами

[ A    0    B ]             [ E   0    0 ]
[-Q  -A^H  -S ] - \lambda * [ 0  E^H   0 ]
[ S^H B^H   R ]             [ 0   0    0 ]

и используя метод QZ-разложения.

В этом алгоритме условия сбоя связаны с симметрией произведения \(U_2 U_1^{-1}\) и число обусловленности \(U_1\). Здесь, \(U\) это матрица 2m×m, содержащая собственные векторы, охватывающие устойчивое подпространство с 2-m строками и разделённую на две матрицы с m строками. См. [1] и [2] для получения дополнительной информации.

Для повышения точности QZ-разложения карандаш проходит через этап балансировки, где сумма абсолютных значений \(H\) и \(J\) элементы (после удаления диагональных элементов суммы) балансируются в соответствии с рецептом, приведенным в [3].

Добавлено в версии 0.11.0.

Ссылки

[1] (1,2)

P. van Dooren, "A Generalized Eigenvalue Approach For Solving Riccati Equations.", SIAM Journal on Scientific and Statistical Computing, Vol.2(2), DOI:10.1137/0902010

[2]

A.J. Laub, "Метод Шура для решения алгебраических уравнений Риккати", Массачусетский технологический институт. Лаборатория информационных и управляющих систем. LIDS-R ; 859. Доступно онлайн: http://hdl.handle.net/1721.1/1301

[3]

P. Benner, "Symplectic Balancing of Hamiltonian Matrices", 2001, SIAM J. Sci. Comput., 2001, Vol.22(5), DOI:10.1137/S1064827500367993

Примеры

Учитывая a, b, q, и r решить для x:

>>> import numpy as np
>>> from scipy import linalg
>>> a = np.array([[4, 3], [-4.5, -3.5]])
>>> b = np.array([[1], [-1]])
>>> q = np.array([[9, 6], [6, 4.]])
>>> r = 1
>>> x = linalg.solve_continuous_are(a, b, q, r)
>>> x
array([[ 21.72792206,  14.48528137],
       [ 14.48528137,   9.65685425]])
>>> np.allclose(a.T.dot(x) + x.dot(a)-x.dot(b).dot(b.T).dot(x), -q)
True