scipy 如何用“numpy.linalg.eig”求线性无关的特征向量

cidc1ykv  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(195)

从线性代数中我们知道任何对称矩阵(我们称之为A)的特征向量都是正交的,这意味着如果M是所有特征向量的矩阵,我们应该得到|det(M)| = 1。我曾希望在numpy.linalg.eig中看到这一点,但得到了以下行为:

import numpy as np

def get_det(A, func, decimals=12):
    eigenvectors = func(A)[1]
    return np.round(np.absolute(np.linalg.det(eigenvectors)), decimals=decimals)

n = 100
x = np.meshgrid(* 2 * [np.linspace(0, 2 * np.pi, n)])
A = np.sin(x[0]) + np.sin(x[1])
A += A.T # This step is redundant; just to convince everyone that it's symmetric
print(get_det(A, np.linalg.eigh), get_det(A, np.linalg.eig))

输出量

>>> 1.0 0.0

正如您所看到的,numpy.linalg.eigh给出了正确的结果,而numpy.linalg.eig显然返回了一个近似不可逆的矩阵。(在本例中为0),并且相应的特征空间不是正交的,因此总行列式不是1。(通常)没有退化特征值,结果确实是一样的:

import numpy as np
n = 100
A = np.random.randn(n, n)
A += A.T

print(get_det(A, np.linalg.eigh), get_det(A, np.linalg.eig))

输出量

>>> 1.0 1.0

现在不管我的猜测是否正确(即eigeigh之间的差异来自于特征值的退化),我想知道是否有一种方法可以获得全维特征向量矩阵(也就是最大化行列式的那个),因为我现在处理的是一个近似对称的矩阵,但不是完全对称的,而且如果特征向量矩阵不可逆的话会给我带来很多问题。2提前感谢你的帮助!

epggiuax

epggiuax1#

要查找线性独立的特征向量,可以尝试Matrix.rref(),它指定了由特征向量形成的矩阵的简化行阶梯形式。
考虑一个不可对角化的矩阵,即其特征空间不是满秩

array([[0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 0.]])

我们可以使用rref()找到它的线性无关特征向量

A = np.diag(np.ones(2), 1) 
v = np.linalg.eig(A)[1]
result = sympy.Matrix(np.round(v, decimals=100)).rref()
v[:, result[1]]

其返回

array([[1.],
       [0.],
       [0.]])

另请参阅:python built-in function to do matrix reduction
Find a linearly independent set of vectors that spans the same substance of R^3 as that spanned

相关问题