从线性代数中我们知道,任何对称矩阵(我们称之为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
之间的区别来自特征值的简并),我想知道是否有一种方法可以使用numpy.linalg.eig
得到一个全维特征向量矩阵(也就是使行列式最大化的矩阵),因为我现在处理的是一个接近对称的矩阵,但不是完全对称的,如果特征向量矩阵不是可逆的,它给了我很多问题。谢谢你提前提供帮助!
发布于 2022-06-28 16:22:12
要找到线性独立的特征向量,可以尝试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.]])
https://stackoverflow.com/questions/72731960
复制相似问题