qz#
- scipy.linalg.qz(A, B, output='real', lwork=None, sort=None, overwrite_a=False, overwrite_b=False, check_finite=True)[Quelle]#
QZ-Zerlegung für generalisierte Eigenwerte eines Matrizenpaares.
Die QZ-Zerlegung, auch bekannt als generalisierte Schur-Zerlegung, für ein Paar von n-mal-n-Matrizen (A,B) ist
(A,B) = (Q @ AA @ Z*, Q @ BB @ Z*)
wobei AA, BB in generalisierter Schur-Form sind, wenn BB obere Dreiecksmatrix mit nicht-negativer Diagonale und AA obere Dreiecksmatrix ist, oder für die reelle QZ-Zerlegung (
output='real') blockweise obere Dreiecksmatrix mit 1x1- und 2x2-Blöcken. In diesem Fall entsprechen die 1x1-Blöcke reellen generalisierten Eigenwerten und die 2x2-Blöcke werden „standardisiert“, indem die entsprechenden Elemente von BB die Form haben[ a 0 ] [ 0 b ]
und das Paar der entsprechenden 2x2-Blöcke in AA und BB hat ein komplex konjugiertes Paar von generalisierten Eigenwerten. Wenn (
output='complex') oder A und B komplexe Matrizen sind, bezeichnet Z’ die konjugiert Transponierte von Z. Q und Z sind unitäre Matrizen.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(N, N) array_like
Zu zerlegende 2D-Array
- B(N, N) array_like
Zu zerlegende 2D-Array
- output{‘real’, ‘complex’}, optional
Konstruiert die reelle oder komplexe QZ-Zerlegung für reelle Matrizen. Standard ist ‘real’.
- lworkint, optional
Größe des Arbeitsfeldes. Wenn None oder -1, wird es automatisch berechnet.
- sort{None, callable, ‘lhp’, ‘rhp’, ‘iuc’, ‘ouc’}, optional
HINWEIS: DIESE EINGABE IST DERZEIT DEAKTIVIERT. Verwenden Sie stattdessen ordqz.
Gibt an, ob die oberen Eigenwerte sortiert werden sollen. Es kann eine aufrufbare Funktion übergeben werden, die für einen gegebenen Eigenwert ein boolesches Ergebnis liefert, das angibt, ob der Eigenwert nach links oben sortiert werden soll (True). Für reelle Matrizenpaare nimmt die Sortierfunktion drei reelle Argumente (alphar, alphai, beta). Der Eigenwert ist
x = (alphar + alphai*1j)/beta. Für komplexe Matrizenpaare oder output=’complex’ nimmt die Sortierfunktion zwei komplexe Argumente (alpha, beta). Der Eigenwert istx = (alpha/beta). Alternativ können Zeichenkettenparameter verwendet werden‘lhp’ Linke Halbebene (x.real < 0.0)
‘rhp’ Rechte Halbebene (x.real > 0.0)
‘iuc’ Innerhalb des Einheitskreises (x*x.conjugate() < 1.0)
‘ouc’ Außerhalb des Einheitskreises (x*x.conjugate() > 1.0)
Standard ist None (keine Sortierung).
- overwrite_abool, optional
Gibt an, ob Daten in a überschrieben werden sollen (kann die Leistung verbessern)
- overwrite_bbool, optional
Ob Daten in b überschrieben werden sollen (kann die Leistung verbessern)
- check_finitebool, optional
Wenn True, werden die Elemente von A und B auf endliche Zahlen überprüft. Wenn False, wird keine Prüfung durchgeführt und die Matrix wird an den zugrunde liegenden Algorithmus weitergegeben.
- Rückgabe:
- AA(N, N) ndarray
Generalisierte Schur-Form von A.
- BB(N, N) ndarray
Generalisierte Schur-Form von B.
- Q(N, N) ndarray
Die linken Schur-Vektoren.
- Z(N, N) ndarray
Die rechten Schur-Vektoren.
Siehe auch
Hinweise
Q ist transponiert im Vergleich zur äquivalenten Funktion in Matlab.
Hinzugefügt in Version 0.11.0.
Beispiele
>>> import numpy as np >>> from scipy.linalg import qz
>>> A = np.array([[1, 2, -1], [5, 5, 5], [2, 4, -8]]) >>> B = np.array([[1, 1, -3], [3, 1, -1], [5, 6, -2]])
Berechnet die Zerlegung. Die QZ-Zerlegung ist nicht eindeutig. Je nach verwendeter zugrunde liegender Bibliothek kann es Unterschiede bei den Vorzeichen der Koeffizienten in der folgenden Ausgabe geben.
>>> AA, BB, Q, Z = qz(A, B) >>> AA array([[-1.36949157, -4.05459025, 7.44389431], [ 0. , 7.65653432, 5.13476017], [ 0. , -0.65978437, 2.4186015 ]]) # may vary >>> BB array([[ 1.71890633, -1.64723705, -0.72696385], [ 0. , 8.6965692 , -0. ], [ 0. , 0. , 2.27446233]]) # may vary >>> Q array([[-0.37048362, 0.1903278 , 0.90912992], [-0.90073232, 0.16534124, -0.40167593], [ 0.22676676, 0.96769706, -0.11017818]]) # may vary >>> Z array([[-0.67660785, 0.63528924, -0.37230283], [ 0.70243299, 0.70853819, -0.06753907], [ 0.22088393, -0.30721526, -0.92565062]]) # may vary
Verifiziert die QZ-Zerlegung. Bei reeller Ausgabe benötigen wir nur die Transponierte von
Zin den folgenden Ausdrücken.>>> Q @ AA @ Z.T # Should be A array([[ 1., 2., -1.], [ 5., 5., 5.], [ 2., 4., -8.]]) >>> Q @ BB @ Z.T # Should be B array([[ 1., 1., -3.], [ 3., 1., -1.], [ 5., 6., -2.]])
Wiederholt die Zerlegung, aber mit
output='complex'.>>> AA, BB, Q, Z = qz(A, B, output='complex')
Für Kürze in der Ausgabe verwenden wir
np.set_printoptions(), um die Ausgabepräzision von NumPy-Arrays auf 3 zu setzen und winzige Werte als 0 anzuzeigen.>>> np.set_printoptions(precision=3, suppress=True) >>> AA array([[-1.369+0.j , 2.248+4.237j, 4.861-5.022j], [ 0. +0.j , 7.037+2.922j, 0.794+4.932j], [ 0. +0.j , 0. +0.j , 2.655-1.103j]]) # may vary >>> BB array([[ 1.719+0.j , -1.115+1.j , -0.763-0.646j], [ 0. +0.j , 7.24 +0.j , -3.144+3.322j], [ 0. +0.j , 0. +0.j , 2.732+0.j ]]) # may vary >>> Q array([[ 0.326+0.175j, -0.273-0.029j, -0.886-0.052j], [ 0.794+0.426j, -0.093+0.134j, 0.402-0.02j ], [-0.2 -0.107j, -0.816+0.482j, 0.151-0.167j]]) # may vary >>> Z array([[ 0.596+0.32j , -0.31 +0.414j, 0.393-0.347j], [-0.619-0.332j, -0.479+0.314j, 0.154-0.393j], [-0.195-0.104j, 0.576+0.27j , 0.715+0.187j]]) # may vary
Bei komplexen Arrays müssen wir
Z.conj().Tin den folgenden Ausdrücken verwenden, um die Zerlegung zu verifizieren.>>> Q @ AA @ Z.conj().T # Should be A array([[ 1.-0.j, 2.-0.j, -1.-0.j], [ 5.+0.j, 5.+0.j, 5.-0.j], [ 2.+0.j, 4.+0.j, -8.+0.j]]) >>> Q @ BB @ Z.conj().T # Should be B array([[ 1.+0.j, 1.+0.j, -3.+0.j], [ 3.-0.j, 1.-0.j, -1.+0.j], [ 5.+0.j, 6.+0.j, -2.+0.j]])