2013-09-12 7 views
3

Я пытаюсь найти собственные/векторы для следующей матрицы:Неверные собственные значения/Вектора с Numpy

A = np.array([[1, 0, 0], 
       [0, 1, 0], 
       [1, 1, 0]]) 

с использованием кода:

from numpy import linalg as LA 
e_vals, e_vecs = LA.eig(A) 

Я получаю это как ответ:

print(e_vals) 
[ 0. 1. 1.] 

print(e_vecs) 
[[ 0.   0.70710678 0.  ] 
[ 0.   0.   0.70710678] 
[ 1.   0.70710678 0.70710678]] 

Однако, я считаю, что следующим должен быть ответ.

[1] Real Eigenvalue = 0.00000 
[1] Real Eigenvector: 
0.00000 
0.00000 
1.00000 

[2] Real Eigenvalue = 1.00000 
[2] Real Eigenvector: 
1.00000 
0.00000 
1.00000 

[3] Real Eigenvalue = 1.00000 
[3] Real Eigenvector: 
0.00000 
1.00000 
1.00000 

То есть, проблема собственных значений, собственных векторов говорит о том, что последующие должны справедливы:

# A * e_vecs = e_vals * e_vecs 
print(A.dot(e_vecs)) 
[[ 0.   0.70710678 0.  ] 
[ 0.   0.   0.70710678] 
[ 0.   0.70710678 0.70710678]] 

print(e_vals.dot(e_vecs)) 
[ 1.   0.70710678 1.41421356] 

ответ

4

Собственные возвращаемые linalg.eig являются векторами-столбцами, так что вам нужно перебрать транспонировать из e_vecs (поскольку итерация по двумерному массиву возвращает по умолчанию значения векторов строк):

import numpy as np 
import numpy.linalg as LA 
A = np.array([[1, 0, 0], [0, 1, 0], [1, 1, 0]]) 
e_vals, e_vecs = LA.eig(A) 

print(e_vals) 
# [ 0. 1. 1.] 
print(e_vecs) 
# [[ 0.   0.   1.  ] 
# [ 0.70710678 0.   0.70710678] 
# [ 0.   0.70710678 0.70710678]] 

for val, vec in zip(e_vals, e_vecs.T): 
    assert np.allclose(np.dot(A, vec), val * vec) 
+0

Hi unutbu, однако не все еще проблема? Если вы умножили A на первый векторный результат [0, 0.70710678, 0], вы получили бы [0, 0.70710678, 0.70710678], который нельзя отбросить обратно в собственный вектор? –

+0

После транспонирования 'e_vecs', собственные векторы являются * строками *' e_vecs'. Я переместил 'e_vecs', чтобы упростить итерацию по собственным векторам с помощью' zip (e_vals, e_vecs) '. – unutbu

+0

А у меня это получилось. Спасибо! –