NumPy linalg.eigh возвращает неправильные собственные векторы - PullRequest
0 голосов
/ 02 июня 2018

Я использую пакет линейной алгебры NumPy для вычисления собственных векторов, соответствующих минимальному собственному значению больших эрмитовых матриц.Функция linalg.eigh утверждает, что возвращает собственные значения эрмитовой матрицы в порядке возрастания, а также соответствующие собственные векторы.Это именно то, что мне нужно.Однако, похоже, что эта функция не работает даже в простом случае уже диагональной матрицы.Например:

import numpy as np

H = np.diag([-0.4,-0.5, 0.4, 2.3, -0.5, -0.6, 0.3, 2.2, 0.4, 0.3, 1.2, 3.1, 2.3, 2.2, 3.1, 5.])
np.linalg.eigh(H)

Выход составляет

(array([-0.6, -0.5, -0.5, -0.4,  0.3,  0.3,  0.4,  0.4,  1.2,  2.2,  2.2, 2.3,  2.3,  3.1,  3.1,  5. ]),
array([[ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.]]))

, т.е. функция выводит [0,0,0,1, ...] в качестве собственного вектора, соответствующего -0,6, чтоявно не соответствует действительности.Кто-нибудь может сказать мне, почему эта функция не работает?

1 Ответ

0 голосов
/ 02 июня 2018

См. Документацию NumPy: https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.linalg.eigh.html.

Собственные векторы возвращаются в виде столбцов выходного массива, а не строк.Вы увидите, что v [:, 0] - собственный вектор, соответствующий -0,6.Если вы транспонируете результат, вы можете преобразовать собственные векторы в формат строки.

...