scipy.linalg.

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 e und s nicht beide explizit None sind, 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 e die Identitätsmatrix und s die 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_are

Lö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