linalg.
eig
计算一个方阵的特征值和右特征向量。
计算特征值和右特征向量的矩阵
特征值,每一个根据其多重性重复。特征值不一定是有序的。生成的数组将是复杂类型,除非虚部为零,在这种情况下,它将被转换为实数类型。什么时候? a 是真的,得到的特征值将是实的(0虚部)或以共轭对出现。
归一化(单位“长度”)特征向量,以便 v[:,i] 特征向量是否与特征值相对应? w[i] .
v[:,i]
w[i]
如果特征值计算不收敛。
参见
eigvals
非对称阵列的特征值。
eigh
实对称或复厄米特(共轭对称)阵列的特征值和特征向量。
eigvalsh
实对称或复厄米特(共轭对称)阵列的特征值。
scipy.linalg.eig
SciPy中的类似函数,也解决了广义特征值问题。
scipy.linalg.schur
酉矩阵和其他非厄米正规矩阵的最佳选择。
笔记
1.8.0 新版功能.
广播规则适用,见 numpy.linalg 有关详细信息的文档。
numpy.linalg
这是使用 _geev 计算一般方阵的特征值和特征向量的LAPACK程序。
_geev
数字 w 是的特征值 a 如果存在矢量 v 这样的话 a @ v = w * v . 因此,阵列 a , w 和 v 满足方程式 a @ v[:,i] = w[i] * v[:,i] 对于 .
a @ v = w * v
a @ v[:,i] = w[i] * v[:,i]
数组 v 特征向量的秩可能不是最大的,也就是说,有些列可能是线性相关的,尽管舍入误差可能会掩盖这一事实。如果特征值都是不同的,那么理论上特征向量是线性无关的 a 可以通过使用 v ,即, inv(v) @ a @ v 是对角线。
inv(v) @ a @ v
非Hermitian正规矩阵的SciPy函数 scipy.linalg.schur 因为矩阵 v 保证是单一的,使用时不是这样 eig . Schur分解产生一个上三角矩阵而不是一个对角矩阵,但对于正规矩阵,只需要上三角矩阵的对角,其余的是舍入误差。
最后,强调 v 包括 正确的 (如右侧)特征向量 a . 向量 y 令人满意的 y.T @ a = z * y.T 对于一些数字 z 被称为 left 特征向量 a 一般来说,矩阵的左、右特征向量不一定是彼此的(可能是共轭的)转置。
y.T @ a = z * y.T
工具书类
斯特朗 线性代数及其应用 ,第2版,奥兰多,佛罗里达州,学术出版社,1980年,各种pp.
实例
>>> from numpy import linalg as LA
(几乎)具有实际e值和e向量的小例子。
>>> 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值和e向量;注意,e值是彼此的复数共轭。
>>> 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]])
具有实e值(但不包括复数e向量)的复数矩阵;注意 a.conj().T == a ,即 a 是赫米特人。
a.conj().T == 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.]])