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