从线性代数中我们知道任何对称矩阵(我们称之为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
现在不管我的猜测是否正确(即eig
和eigh
之间的差异来自于特征值的退化),我想知道是否有一种方法可以获得全维特征向量矩阵(也就是最大化行列式的那个),因为我现在处理的是一个近似对称的矩阵,但不是完全对称的,而且如果特征向量矩阵不可逆的话会给我带来很多问题。2提前感谢你的帮助!
1条答案
按热度按时间epggiuax1#
要查找线性独立的特征向量,可以尝试Matrix.rref(),它指定了由特征向量形成的矩阵的简化行阶梯形式。
考虑一个不可对角化的矩阵,即其特征空间不是满秩
我们可以使用rref()找到它的线性无关特征向量
其返回
另请参阅: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