Вырожденные собственные векторы не учитывают симметрию матрицы при использовании библиотек SciPy или NumPy - PullRequest
0 голосов
/ 07 сентября 2018

Мы пытаемся диагонализировать две следующие матрицы: matrix1 и matrix2 Мы сравнили наши результаты с Wolfram Mathematica, и в первой матрице мы получили разные результаты при сравнении собственных векторов, соответствующих вырожденным собственным значениям.

Вот код, который мы используем в python. В Mathematica мы просто используем классическую функцию «Eigensystem []».

Как видно из первой матрицы, результаты SciPy и Mathematica действительно разные, а для второй совпадают.

В частности, мы наблюдаем, что для первой матрицы 2-й и 3-й собственные векторы вырождены по энергии. В 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)

1 Ответ

0 голосов
/ 07 сентября 2018

Основа для собственного пространства, связанного с собственным значением с геометрической кратностью 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
...