schur#
- scipy.linalg.schur(a, output='real', lwork=None, overwrite_a=False, sort=None, check_finite=True)[原始碼]#
計算矩陣的 Schur 分解。
Schur 分解為
A = Z T Z^H
其中 Z 是么正矩陣,而 T 要么是上三角矩陣,要么對於實數 Schur 分解 (output='real'),是擬上三角矩陣。在擬三角形式中,描述複數值特徵值對的 2x2 區塊可能會從對角線突出。
- 參數:
- a(M, M) 陣列型物件
要分解的矩陣
- output{‘real’, ‘complex’}, 可選
當 a 的 dtype 為實數時,此參數指定要計算實數或複數 Schur 分解。當 a 的 dtype 為複數時,此參數將被忽略,並計算複數 Schur 分解。
- lworkint, 可選
工作陣列大小。如果為 None 或 -1,則會自動計算。
- overwrite_abool, 可選
是否覆寫陣列 a 中的資料(可能提升效能)。
- sort{None, 可呼叫物件, ‘lhp’, ‘rhp’, ‘iuc’, ‘ouc’}, 可選
指定是否應對上特徵值進行排序。可以傳遞一個可呼叫物件,該物件在給定特徵值時,返回一個布林值,表示特徵值是否應排序到左上角 (True)。
如果
output='complex'
或 a 的 dtype 為複數,則可呼叫物件應具有一個參數:表示為複數的特徵值。如果
output='real'
且 a 的 dtype 為實數,則可呼叫物件應具有兩個參數:特徵值的實部和虛部分別。
或者,可以使用字串參數
'lhp' Left-hand plane (real(eigenvalue) < 0.0) 'rhp' Right-hand plane (real(eigenvalue) >= 0.0) 'iuc' Inside the unit circle (abs(eigenvalue) <= 1.0) 'ouc' Outside the unit circle (abs(eigenvalue) > 1.0)
預設為 None(不排序)。
- check_finitebool, 可選
是否檢查輸入矩陣是否僅包含有限數字。停用可能會提升效能,但如果輸入包含無限值或 NaN,則可能會導致問題(崩潰、非終止)。
- 返回:
- T(M, M) ndarray
A 的 Schur 形式。對於實數 Schur 分解,它是實數值。
- Z(M, M) ndarray
A 的么正 Schur 轉換矩陣。對於實數 Schur 分解,它是實數值。
- sdimint
如果且僅當請求排序時,第三個返回值將包含滿足排序條件的特徵值數量。請注意,對於複共軛對,如果任一特徵值的條件為真,則計為 2。
- 引發:
- LinAlgError
在三種情況下引發錯誤
由於 QR 演算法未能計算所有特徵值,演算法失敗。
如果請求特徵值排序,則由於未能分離特徵值(通常是由於不良條件),特徵值無法重新排序。
如果請求特徵值排序,則捨入誤差導致前導特徵值不再滿足排序條件。
另請參閱
rsf2csf
將實數 Schur 形式轉換為複數 Schur 形式
範例
>>> import numpy as np >>> from scipy.linalg import schur, eigvals >>> A = np.array([[0, 2, 2], [0, 1, 2], [1, 0, 1]]) >>> T, Z = schur(A) >>> T array([[ 2.65896708, 1.42440458, -1.92933439], [ 0. , -0.32948354, -0.49063704], [ 0. , 1.31178921, -0.32948354]]) >>> Z array([[0.72711591, -0.60156188, 0.33079564], [0.52839428, 0.79801892, 0.28976765], [0.43829436, 0.03590414, -0.89811411]])
>>> T2, Z2 = schur(A, output='complex') >>> T2 array([[ 2.65896708, -1.22839825+1.32378589j, 0.42590089+1.51937378j], # may vary [ 0. , -0.32948354+0.80225456j, -0.59877807+0.56192146j], [ 0. , 0. , -0.32948354-0.80225456j]]) >>> eigvals(T2) array([2.65896708, -0.32948354+0.80225456j, -0.32948354-0.80225456j]) # may vary
自訂特徵值排序條件,僅由一個特徵值滿足正虛部條件。
>>> _, _, sdim = schur(A, output='complex', sort=lambda x: x.imag > 1e-15) >>> sdim 1
當
output='real'
且陣列 a 為實數時,sort 可呼叫物件必須接受實部和虛部作為個別參數。請注意,現在複數特徵值-0.32948354+0.80225456j
和-0.32948354-0.80225456j
將被視為複共軛對,並且根據 sdim 文檔,對於任一特徵值條件為真的複共軛對,sdim 會增加兩個。>>> _, _, sdim = schur(A, output='real', sort=lambda x, y: y > 1e-15) >>> sdim 2