scipy.linalg.

solve_discrete_are#

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

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

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

\[A^HXA - X - (A^HXB) (R + B^HXB)^{-1} (B^HXA) + Q = 0\]

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

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

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

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

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

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

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

Параметры:
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_continuous_are

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

Примечания

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

[  A   0   B ]             [ E   0   B ]
[ -Q  E^H -S ] - \lambda * [ 0  A^H  0 ]
[ S^H  0   R ]             [ 0 -B^H  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 as la
>>> a = np.array([[0, 1], [0, -1]])
>>> b = np.array([[1, 0], [2, 1]])
>>> q = np.array([[-4, -4], [-4, 7]])
>>> r = np.array([[9, 3], [3, 1]])
>>> x = la.solve_discrete_are(a, b, q, r)
>>> x
array([[-4., -4.],
       [-4.,  7.]])
>>> R = la.solve(r + b.T.dot(x).dot(b), b.T.dot(x).dot(a))
>>> np.allclose(a.T.dot(x).dot(a) - x - a.T.dot(x).dot(b).dot(R), -q)
True