scipy.linalg.

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 e oder s nicht genau None ist, 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 e als Identität und s als Nullmatrix mit zu a und b kompatiblen 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_are

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