numpy.linalg.eig #
- 利纳尔格。eig ( a ) [来源] #
计算方阵的特征值和右特征向量。
- 参数:
- 一个(…, M, M) 数组
将计算特征值和右特征向量的矩阵
- 返回:
- 具有以下属性的命名元组:
- 特征值(…, M) 数组
特征值,每个特征值根据其多重性重复。特征值不一定是有序的。生成的数组将是复数类型,除非虚部为零,在这种情况下它将被转换为实数类型。当a 为实数时,所得特征值将为实数(0 虚部)或出现在共轭对中
- 特征向量(…, M, M) 数组
归一化(单位“长度”)特征向量,使得该列
eigenvectors[:,i]
是对应于特征值 的特征向量eigenvalues[i]
。
- 加薪:
- 林算法错误
如果特征值计算不收敛。
也可以看看
eigvals
非对称数组的特征值。
eigh
实对称或复埃尔米特(共轭对称)数组的特征值和特征向量。
eigvalsh
实对称或复埃尔米特(共轭对称)数组的特征值。
scipy.linalg.eig
SciPy 中的类似函数也解决了广义特征值问题。
scipy.linalg.schur
酉矩阵和其他非厄米正规矩阵的最佳选择。
笔记
1.8.0 版本中的新增功能。
广播规则适用,
numpy.linalg
详细信息请参阅文档。这是使用
_geev
LAPACK 例程来实现的,该例程计算一般方阵的特征值和特征向量。如果存在向量v使得 ,则数字w是a的特征值。因此,数组a、特征值和 特征向量满足以下方程:
a @ v = w * v
a @ eigenvectors[:,i] = eigenvalues[i] * eigenvalues[:,i]
\(i \in \{0,...,M-1\}\)。数组特征向量可能不是最大秩的,也就是说,某些列可能是线性相关的,尽管舍入误差可能会掩盖这一事实。如果特征值都不同,那么理论上特征向量是线性无关的,并且可以使用特征向量通过相似变换对a进行对角化,即,是对角的。
inv(eigenvectors) @ a @ eigenvectors
对于非厄米特正规矩阵,
scipy.linalg.schur
首选 SciPy 函数,因为保证矩阵特征向量是酉的,而使用 时情况并非如此eig
。 Schur 分解产生上三角矩阵而不是对角矩阵,但对于普通矩阵,只需要上三角矩阵的对角线,其余的是舍入误差。最后,需要强调的是,特征向量由a的右侧(如右侧)特征向量组成。满足某个数字z的向量y称为a的左特征向量,并且一般来说,矩阵的左特征向量和右特征向量不一定是彼此的(可能是共轭的)转置。
y.T @ a = z * y.T
参考
G. Strang,线性代数及其应用,第二版,佛罗里达州奥兰多,学术出版社,1980 年,各页。
例子
>>> 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是埃尔米特式的。
a.conj().T == a
>>> 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.]])