solve_discrete_are#
- scipy.linalg.solve_discrete_are(a, b, q, r, e=None, s=None, balanced=True)[Quellcode]#
Löst die diskrete algebraische Riccati-Gleichung (DARE).
Die DARE ist definiert als
\[A^HXA - X - (A^HXB) (R + B^HXB)^{-1} (B^HXA) + Q = 0\]Die Einschränkungen für die Existenz einer Lösung sind:
Alle Eigenwerte von \(A\) außerhalb der Einheitskreises sollten steuerbar sein.
Das zugehörige symplektische Pencil (siehe Hinweise) sollte Eigenwerte haben, die ausreichend weit vom Einheitskreis entfernt sind.
Darüber hinaus, wenn
eundsnicht beide explizitNonesind, dann wird die verallgemeinerte Version der DARE\[A^HXA - E^HXE - (A^HXB+S) (R+B^HXB)^{-1} (B^HXA+S^H) + Q = 0\]gelöst. Wenn weggelassen, wird angenommen, dass
edie Identitätsmatrix undsdie Nullmatrix ist.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
Quadratische Matrix
- e(M, M) array_like, optional
Nicht-singuläre quadratische Matrix
- s(M, N) array_like, optional
Eingabe
- balancedbool
Der Boolesche Wert, der angibt, ob ein Balancing-Schritt auf den Daten durchgeführt wird. Der Standardwert ist True.
- Rückgabe:
- x(M, M) ndarray
Lösung der diskreten 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_continuous_areLöst die kontinuierliche algebraische Riccati-Gleichung
Hinweise
Die Gleichung wird gelöst, indem der erweiterte symplektische Matrix-Pencil gebildet wird, wie in [1] beschrieben, \(H - \lambda J\) gegeben durch die Blockmatrizen
[ A 0 B ] [ E 0 B ] [ -Q E^H -S ] - \lambda * [ 0 A^H 0 ] [ S^H 0 R ] [ 0 -B^H 0 ]
und eine QZ-Zerlegungsmethode verwendet wird.
Bei diesem Algorithmus hängen die Fehlerbedingungen mit der Symmetrie des Produkts \(U_2 U_1^{-1}\) und der Konditionszahl von \(U_1\) zusammen. Hier ist \(U\) die 2m x m Matrix, die die Eigenvektoren enthält, die den stabilen Unterraum aufspannen, mit 2m Zeilen, aufgeteilt in zwei m-zeilige Matrizen. 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 Zeilen/Spalten von \(H\) und \(J\) (nach Entfernung der Diagonaleinträge) gemäß dem Rezept in [3] ausgeglichen wird. Wenn die Daten kleine numerische Störungen aufweisen, kann das Balancing deren Effekte verstärken, und eine Bereinigung ist erforderlich.
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, Bd.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, Bd.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 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