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