本文簡要介紹 python 語言中 scipy.linalg.qz
的用法。
用法:
scipy.linalg.qz(A, B, output='real', lwork=None, sort=None, overwrite_a=False, overwrite_b=False, check_finite=True)#
一對矩陣的廣義特征值的 QZ 分解。
一對 n-by-n 矩陣 (A,B) 的 QZ 或廣義 Schur 分解為:
(A,B) = (Q @ AA @ Z*, Q @ BB @ Z*)
其中 AA、BB 是廣義 Schur 形式,如果 BB 是具有非負對角線的上三角且 AA 是上三角,或者對於實數 QZ 分解 (
output='real'
) 具有 1x1 和 2x2 塊的塊上三角。在這種情況下,1x1 塊對應於實廣義特征值,2x2 塊通過使 BB 的相應元素具有以下形式而成為‘standardized’:[ a 0 ] [ 0 b ]
AA 和 BB 中對應的 2x2 塊對將具有廣義特征值的複共軛對。如果 (
output='complex'
) 或 A 和 B 是複矩陣,則 Z' 表示 Z 的 conjugate-transpose。Q 和 Z 是酉矩陣。- A: (N, N) 數組
二維數組分解
- B: (N, N) 數組
二維數組分解
- output: {‘real’, ‘complex’},可選
為實矩陣構造實數或複數 QZ 分解。默認為‘real’。
- lwork: 整數,可選
工作數組大小。如果 None 或 -1,它會自動計算。
- sort: {無,可調用,‘lhp’, ‘rhp’, ‘iuc’, ‘ouc’},可選
注意:此輸入目前已禁用。請改用 ordqz。
指定是否應該對上特征值進行排序。可以傳遞一個可調用對象,給定一個特征值,返回一個布爾值,表示特征值是否應該排序到左上角 (True)。對於實數矩陣對,排序函數采用三個實數參數(alphar、alphai、beta)。特征值
x = (alphar + alphai*1j)/beta
。對於複數矩陣對或 output='complex',排序函數采用兩個複數參數(alpha,beta)。特征值x = (alpha/beta)
。或者,可以使用字符串參數:‘lhp’ Left-hand plane (x.real < 0.0)
‘rhp’ Right-hand plane (x.real > 0.0)
‘iuc’ Inside the unit circle (x*x.conjugate() < 1.0)
‘ouc’ Outside the unit circle (x*x.conjugate() > 1.0)
默認為無(無排序)。
- overwrite_a: 布爾型,可選
是否覆蓋 a 中的數據(可能會提高性能)
- overwrite_b: 布爾型,可選
是否覆蓋b中的數據(可能會提高性能)
- check_finite: 布爾型,可選
如果為真,則檢查 A 和 B 的元素是有限數。如果 false 不檢查並將矩陣傳遞給底層算法。
- AA: (N, N) 數組
A 的廣義 Schur 形式。
- BB: (N, N) 數組
B 的廣義 Schur 形式。
- Q: (N, N) 數組
左 Schur 向量。
- Z: (N, N) 數組
右 Schur 向量。
參數 ::
返回 ::
注意:
Q 與 Matlab 中的等效函數進行了轉置。
例子:
>>> 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]])
計算分解。 QZ 分解不是唯一的,因此根據所使用的底層庫,以下輸出中的係數符號可能存在差異。
>>> 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
驗證 QZ 分解。對於實際輸出,我們隻需要在以下表達式中轉置
Z
。>>> 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.]])
重複分解,但使用
output='complex'
。>>> AA, BB, Q, Z = qz(A, B, output='complex')
為了輸出簡潔,我們使用
np.set_printoptions()
將NumPy數組的輸出精度設置為3,並將微小值顯示為0。>>> 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
對於複雜數組,我們必須在以下表達式中使用
Z.conj().T
來驗證分解。>>> 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]])
相關用法
- Python SciPy linalg.qr_multiply用法及代碼示例
- Python SciPy linalg.qr_insert用法及代碼示例
- Python SciPy linalg.qr用法及代碼示例
- Python SciPy linalg.qr_update用法及代碼示例
- Python SciPy linalg.qr_delete用法及代碼示例
- Python SciPy linalg.qmr用法及代碼示例
- Python SciPy linalg.eigvalsh_tridiagonal用法及代碼示例
- Python SciPy linalg.cdf2rdf用法及代碼示例
- Python SciPy linalg.LaplacianNd用法及代碼示例
- Python SciPy linalg.solve_circulant用法及代碼示例
- Python SciPy linalg.polar用法及代碼示例
- Python SciPy linalg.clarkson_woodruff_transform用法及代碼示例
- Python SciPy linalg.rsf2csf用法及代碼示例
- Python SciPy linalg.hessenberg用法及代碼示例
- Python SciPy linalg.tril用法及代碼示例
- Python SciPy linalg.triu用法及代碼示例
- Python SciPy linalg.svd用法及代碼示例
- Python SciPy linalg.ishermitian用法及代碼示例
- Python SciPy linalg.invhilbert用法及代碼示例
- Python SciPy linalg.factorized用法及代碼示例
- Python SciPy linalg.lu_factor用法及代碼示例
- Python SciPy linalg.SuperLU用法及代碼示例
- Python SciPy linalg.lsqr用法及代碼示例
- Python SciPy linalg.cho_factor用法及代碼示例
- Python SciPy linalg.fractional_matrix_power用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.linalg.qz。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。