solve_continuous_are#
- scipy.linalg.solve_continuous_are(a, b, q, r, e=None, s=None, balanced=True)[Quelle]#
Löst die kontinuierliche algebraische Riccati-Gleichung (CARE).
Die CARE ist definiert als
\[X A + A^H X - X B R^{-1} B^H X + Q = 0\]Die Einschränkungen für die Existenz einer Lösung sind:
Alle Eigenwerte von \(A\) in der rechten Halbebene müssen steuerbar sein.
Der zugehörige Hamiltonsche Pencil (siehe Hinweise) muss Eigenwerte haben, die ausreichend weit von der imaginären Achse entfernt sind.
Darüber hinaus, wenn
eodersnicht genauNoneist, dann die verallgemeinerte Version der CARE\[E^HXA + A^HXE - (E^HXB + S) R^{-1} (B^HXE + S^H) + Q = 0\]wird gelöst. Wenn weggelassen, wird
eals Identität undsals Nullmatrix mit zuaundbkompatiblen Größen angenommen.Die Dokumentation wurde unter der Annahme verfasst, dass die Array-Argumente bestimmte „Kern“-Formen haben. Array-Argumente dieser Funktion können jedoch zusätzliche „Batch“-Dimensionen vorangestellt haben. In diesem Fall wird das Array als Stapel von niedrigdimensionalen Schnitten behandelt; siehe Gestapelte lineare Operationen für Details.
- Parameter:
- a(M, M) array_like
Quadratische Matrix
- b(M, N) array_like
Eingabe
- q(M, M) array_like
Eingabe
- r(N, N) array_like
Nicht-singuläre quadratische Matrix
- e(M, M) array_like, optional
Nicht-singuläre quadratische Matrix
- s(M, N) array_like, optional
Eingabe
- balancedbool, optional
Der boolesche Wert, der angibt, ob ein Balancing-Schritt auf die Daten angewendet wird. Der Standardwert ist True.
- Rückgabe:
- x(M, M) ndarray
Lösung der kontinuierlichen algebraischen Riccati-Gleichung.
- Löst aus:
- LinAlgError
Für Fälle, in denen der stabile Unterraum des Pencil nicht isoliert werden konnte. Siehe Abschnitt Hinweise und die Referenzen für Details.
Siehe auch
solve_discrete_areLöst die diskrete algebraische Riccati-Gleichung
Hinweise
Die Gleichung wird gelöst, indem der erweiterte Hamiltonsche Matrix-Pencil gebildet wird, wie in [1] beschrieben, \(H - \lambda J\), gegeben durch die Blockmatrizen
[ A 0 B ] [ E 0 0 ] [-Q -A^H -S ] - \lambda * [ 0 E^H 0 ] [ S^H B^H R ] [ 0 0 0 ]
und unter Verwendung einer QZ-Zerlegungsmethode.
Bei diesem Algorithmus sind die Fehlschlagbedingungen mit der Symmetrie des Produkts \(U_2 U_1^{-1}\) und der Konditionszahl von \(U_1\) verbunden. Hier ist \(U\) die 2m x m Matrix, die die Eigenvektoren enthält, die den stabilen Unterraum aufspannen, mit 2m Zeilen und in zwei m-zeilige Matrizen partitioniert. Siehe [1] und [2] für weitere Details.
Um die Genauigkeit der QZ-Zerlegung zu verbessern, durchläuft der Pencil einen Balancing-Schritt, bei dem die Summe der Absolutwerte der Einträge von \(H\) und \(J\) (nach Entfernen der Diagonaleinträge der Summe) gemäß dem Rezept in [3] gebalancet wird.
Hinzugefügt in Version 0.11.0.
Referenzen
[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, „A Schur Method for Solving Algebraic Riccati Equations.“, Massachusetts Institute of Technology. Laboratory for Information and Decision Systems. LIDS-R ; 859. Online verfügbar: 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
Beispiele
Gegeben a, b, q und r, löse fü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