當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python numpy linalg.eig用法及代碼示例


本文簡要介紹 python 語言中 numpy.linalg.eig 的用法。

用法:

linalg.eig(a)

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

參數

a (…, M, M) 數組

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

返回

w (…, M) 數組

特征值,每個都根據其多重性重複。特征值不一定是有序的。結果數組將是複數類型,除非虛部為零,在這種情況下它將被強製轉換為實數類型。當 a 為實數時,得到的特征值將是實數(0 虛部)或以共軛對形式出現

v (…, M, M) 數組

歸一化(單元“length”)特征向量,使得列v[:,i]是對應於特征值w[i]的特征向量。

拋出

LinAlgError

如果特征值計算不收斂。

注意

廣播規則適用,有關詳細信息,請參閱 numpy.linalg 文檔。

這是使用_geev LAPACK 例程來實現的,該例程計算一般方陣的特征值和特征向量。

號碼w是一個特征值a如果存在向量v這樣a @ v = w * v.因此,數組a,w, 和v滿足方程a @ v[:,i] = w[i] * v[:,i]為了\(i \in \{0,...,M-1\}\) .

數組v的特征向量可能不是最大秩,也就是說,一些列可能是線性相關的,盡管舍入誤差可能會掩蓋這一事實。如果特征值都不同,那麽理論上特征向量是線性獨立的,並且a可以通過使用相似變換對角化v, IE,inv(v) @ a @ v是對角線。

對於非 Hermitian 正規矩陣,SciPy 函數scipy.linalg.schur是首選,因為矩陣v保證是幺正的,使用的時候不是這樣eig. Schur 分解產生上三角矩陣而不是對角矩陣,但對於正規矩陣,隻需要上三角矩陣的對角線,其餘的是舍入誤差。

最後要強調的是v正確的(如右側)的特征向量a.一個向量y令人滿意的y.T @ a = z * y.T對於一些數字z被稱為剩下的特征向量a,並且,一般來說,矩陣的左右特征向量不一定是彼此的(可能是共軛的)轉置。

參考

G. Strang,線性代數及其應用,第 2 版,佛羅裏達州奧蘭多,學術出版社,1980 年,各種 pp。

例子

>>> from numpy import linalg as LA

(幾乎)真實的e-values和e-vectors的簡單例子。

>>> w, v = LA.eig(np.diag((1, 2, 3)))
>>> w; v
array([1., 2., 3.])
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

具有複數e-values和e-vectors的實矩陣;請注意,e-values 是彼此的複共軛。

>>> w, v = LA.eig(np.array([[1, -1], [1, 1]]))
>>> w; v
array([1.+1.j, 1.-1.j])
array([[0.70710678+0.j        , 0.70710678-0.j        ],
       [0.        -0.70710678j, 0.        +0.70710678j]])

Complex-valued 矩陣與實數 e-values(但 complex-valued e-vectors);注意a.conj().T == a, IE。,a是厄米特。

>>> a = np.array([[1, 1j], [-1j, 1]])
>>> w, v = LA.eig(a)
>>> w; v
array([2.+0.j, 0.+0.j])
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. e-values are 1 +/- 1e-9
>>> w, v = LA.eig(a)
>>> w; v
array([1., 1.])
array([[1., 0.],
       [0., 1.]])

相關用法


注:本文由純淨天空篩選整理自numpy.org大神的英文原創作品 numpy.linalg.eig。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。