scipy.linalg.

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

在三種情況下引發錯誤

  1. 由於 QR 演算法未能計算所有特徵值,演算法失敗。

  2. 如果請求特徵值排序,則由於未能分離特徵值(通常是由於不良條件),特徵值無法重新排序。

  3. 如果請求特徵值排序,則捨入誤差導致前導特徵值不再滿足排序條件。

另請參閱

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