我们正在尝试对以下两个矩阵进行对角化:matrix1 和matrix2 我们将结果与 Wolfram Mathematica 进行了比较,在第一个矩阵中,当比较对应于简并特征值的特征向量时,我们获得了不同的结果。
这里是我们在 python 中使用的代码。在 Mathematica 中我们只使用经典函数“Eigensystem[]”。
正如您所见,对于第一个矩阵,SciPy 和 Mathematica 的结果确实不同,而对于第二个矩阵则一致。
特别是我们观察到,对于第一个矩阵,第二个和第三个特征向量的能量是简并的。在 Mathematica 中,“Eigensystem[]”能够找到两个保持矩阵平移对称性的特征向量,而在这种特殊情况下,Python 则不能。
令人惊讶的是,对于第二个矩阵,Mathematica 和 Python 的两个结果是相同的。
有人知道为什么会发生这种情况以及如何解决吗? 我们的目标是将大型稀疏埃尔米特矩阵对角化,但在这种情况下我们也发现了同样的问题。
import numpy as np
from numpy import linalg
import scipy.linalg
t=-1
matrix1 = np.array([ [0, t, 0, 0, t], [t, 0, t, 0, 0],[0, t, 0, t, 0],[0, 0, t, 0, t],[t, 0, 0, t, 0]])
matrix2 = np.array([[0, t, 0, t, 0],[t, 0, t, 0, t],[0, t, 0, t, 0],[t, 0, t, 0, t],[0, t, 0, t, 0]])
E1,V1 = linalg.eigh(matrix1)
E2,V2 = linalg.eigh(matrix2)
print('.....First Matrix')
print('Matrix')
print(matrix1)
print('Eigenvalues')
print(E1)
print('Eigenvectors')
for i in range(len(V1)):
print(V1[:,i]
print('')
print('.....Second Matrix')
print('Matrix')
print(matrix2)
print('Eigenvalues')
print(E2)
print('Eigenvectors')
for i in range(len(V2)):
print(V2[:,i])
这是两个矩阵的 python 和 mathematica 的输出。
......First Matrix..............................................................
.....PYTHON.....
Matrix
[[ 0 -1 0 0 -1]
[-1 0 -1 0 0]
[ 0 -1 0 -1 0]
[ 0 0 -1 0 -1]
[-1 0 0 -1 0]]
Eigenvalues
[-2. -0.618 -0.618 1.618 1.618]
Eigenvectors
[-0.447 -0.447 -0.447 -0.447 -0.447]
[ 0.103 0.625 0.283 -0.450 -0.561]
[-0.624 -0.094 0.566 0.444 -0.291]
[ 0.632 -0.512 0.195 0.195 -0.512]
[ 0.000 0.371 -0.601 0.601 -0.371]
.....MATHEMATICA.....
Eigenvalues
(-2.,-0.618034,-0.618034,1.61803,1.61803)
Eigenvectors
(-0.44721 -0.44721 -0.447214 -0.447214 -0.447214
0.60150 0.37174 -0.371748 -0.601501 0.
0.19544 -0.51166 -0.511667 0.19544 0.632456
-0.51166 0.19544 0.19544 -0.511667 0.632456
-0.37174 0.60150 -0.601501 0.371748 0.)
......Second Matrix..............................................................
.....PYTHON.....
Matrix
[[ 0 -1 0 -1 0]
[-1 0 -1 0 -1]
[ 0 -1 0 -1 0]
[-1 0 -1 0 -1]
[ 0 -1 0 -1 0]]
Eigenvalues
[-2.449 0 0 0 2.449]
Eigenvectors
[ 0.408 0.5 0.408 0.5 0.408]
[ 0.816 0 -0.408 0 -0.408]
[ 0. -0.707 0. 0.707 0. ]
[ 0. 0. -0.707 0. 0.707]
[-0.408 0.5 -0.408 0.5 -0.408]
.....MATHEMATICA.....
Eigenvalues
(-2.44949,0.,0.,3.55271*10^-15,2.44949)
Eigenvectors
(-0.408248 -0.5 -0.408248 -0.5 -0.408248
0 0.707107 0 -0.707107 0
0.707107 0 -0.707107 0 0
-0.408248 0 -0.408248 0 0.816497
-0.408248 0.5 -0.408248 0.5 -0.408248)
最佳答案
与几何重数为 2 的特征值相关的特征空间的基础不是唯一的。因此,两个不同的库返回不同的基数也就不足为奇了。
我认为 numpy.linalg.eigh
对 matrix1
计算的结果没有任何问题。例如,
In [47]: E1, V1 = linalg.eigh(matrix1)
验证E1
和V1
满足特征值问题:
In [48]: np.allclose(matrix1 @ V1, V1 @ np.diag(E1))
Out[48]: True
验证 V1
中的向量是否正交:
In [49]: np.allclose(V1.T @ V1, np.eye(len(matrix1)))
Out[49]: True
关于python - 使用 SciPy 或 NumPy 库,简并特征向量不尊重矩阵的对称性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52225659/