退化特征向量不尊重使用 SciPy 或 NumPy 库的矩阵的对称性



我们试图对角化以下两个矩阵:矩阵 1 和矩阵 2 我们将我们的结果与 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.eighmatrix1计算的结果没有任何问题. 例如

In [47]: E1, V1 = linalg.eigh(matrix1)

验证E1V1是否满足特征值问题:

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

最新更新