当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。