numpy.linalg.eig#

linalg.eig(a)[原始碼]#

計算方陣的特徵值和右特徵向量。

參數:
a(…, M, M) 陣列

將計算其特徵值和右特徵向量的矩陣

返回:
一個具名的元組,包含以下屬性
eigenvalues(…, M) 陣列

特徵值,每個特徵值根據其重數重複。特徵值不一定排序。結果陣列將為複數型別,除非虛部為零,在這種情況下將轉換為實數型別。當 a 為實數時,結果特徵值將為實數(虛部為 0)或成共軛對出現

eigenvectors(…, M, M) 陣列

標準化(單位「長度」)特徵向量,使得列 eigenvectors[:,i] 是對應於特徵值 eigenvalues[i] 的特徵向量。

引發:
LinAlgError

如果特徵值計算不收斂。

另請參閱

eigvals

非對稱陣列的特徵值。

eigh

實對稱或複 Hermitian(共軛對稱)陣列的特徵值和特徵向量。

eigvalsh

實對稱或複 Hermitian(共軛對稱)陣列的特徵值。

scipy.linalg.eig

SciPy 中類似的函式,也解決廣義特徵值問題。

scipy.linalg.schur

酉矩陣和其他非 Hermitian 正規矩陣的最佳選擇。

註解

廣播規則適用,詳情請參閱 numpy.linalg 文件。

這是使用 _geev LAPACK 常式實作的,該常式計算一般方陣的特徵值和特徵向量。

數字 wa 的特徵值,如果存在向量 v 使得 a @ v = w * v。因此,陣列 aeigenvalueseigenvectors 滿足方程式 a @ eigenvectors[:,i] = eigenvalues[i] * eigenvectors[:,i],對於 \(i \in \{0,...,M-1\}\)

陣列 eigenvectors 可能不是最大秩,也就是說,某些列可能是線性相關的,儘管捨入誤差可能會掩蓋這個事實。如果特徵值都不同,那麼理論上特徵向量是線性獨立的,並且 a 可以通過使用 eigenvectors 的相似變換進行對角化,即 inv(eigenvectors) @ a @ eigenvectors 是對角矩陣。

對於非 Hermitian 正規矩陣,SciPy 函式 scipy.linalg.schur 是首選,因為矩陣 eigenvectors 保證是酉矩陣,而使用 eig 時則不然。Schur 分解產生一個上三角矩陣而不是對角矩陣,但對於正規矩陣,只需要上三角矩陣的對角線,其餘的是捨入誤差。

最後,強調 eigenvectorsa(如右手邊)特徵向量組成。滿足 y.T @ a = z * y.T 的向量 y 對於某個數字 z 稱為 a特徵向量,並且一般來說,矩陣的左特徵向量和右特徵向量不一定是彼此的(可能共軛)轉置。

參考文獻

G. Strang,《線性代數及其應用》,第二版,奧蘭多,佛羅里達州,學術出版社公司,1980 年,各頁。

範例

>>> import numpy as np
>>> from numpy import linalg as LA

(幾乎)平凡的範例,具有實數特徵值和特徵向量。

>>> eigenvalues, eigenvectors = LA.eig(np.diag((1, 2, 3)))
>>> eigenvalues
array([1., 2., 3.])
>>> eigenvectors
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

具有複數特徵值和特徵向量的實數矩陣;請注意,特徵值是彼此的複數共軛。

>>> eigenvalues, eigenvectors = LA.eig(np.array([[1, -1], [1, 1]]))
>>> eigenvalues
array([1.+1.j, 1.-1.j])
>>> eigenvectors
array([[0.70710678+0.j        , 0.70710678-0.j        ],
       [0.        -0.70710678j, 0.        +0.70710678j]])

具有實數特徵值(但複數值特徵向量)的複數值矩陣;請注意 a.conj().T == a,即 a 是 Hermitian 矩陣。

>>> a = np.array([[1, 1j], [-1j, 1]])
>>> eigenvalues, eigenvectors = LA.eig(a)
>>> eigenvalues
array([2.+0.j, 0.+0.j])
>>> eigenvectors
array([[ 0.        +0.70710678j,  0.70710678+0.j        ], # may vary
       [ 0.70710678+0.j        , -0.        +0.70710678j]])

請注意捨入誤差!

>>> a = np.array([[1 + 1e-9, 0], [0, 1 - 1e-9]])
>>> # Theor. eigenvalues are 1 +/- 1e-9
>>> eigenvalues, eigenvectors = LA.eig(a)
>>> eigenvalues
array([1., 1.])
>>> eigenvectors
array([[1., 0.],
       [0., 1.]])