2017-12-02 19 views
0

あらかじめ謝罪していますが、Pythonは私の強い訴訟ではありません。Pythonで計算された行列の固有ベクトルが固有ベクトルではないようです

この行列の実際の固有値に対応する固有ベクトルは、固有ベクトルではないように見えますが、Wolfram Alphaで計算された固有ベクトルは動作するように見えます。 (私の同僚は、私が写しを持っていないのに、同じ病理は、Rで計算を行う際にケースのように表示されていることを確認した。)コードスニペット:

>>> import numpy as np 
>>> in_matrix = np.array([[0.904, 0.012, 0.427], [-0.0032, 0.99975, -0.02207], [-0.4271, 0.0186, 0.904]]) 
>>> evals, evecs = np.linalg.eig(in_matrix) 
>>> print evals 
[ 0.90388357+0.42760138j 0.90388357-0.42760138j 0.99998285+0.j] 
>>> print evecs[2] 
[ 0.70696571+0.j 0.70696571-0.j 0.01741090+0.j] 
>>> print in_matrix.dot(evecs[2]) 
[ 0.65501505+0.j 0.70414242+0.j -0.27305604+0.j] 

注意をin_matrix変数によってevecs[2]を乗算すると、新しいを生成することベクトルはevecs[2]ではありません(固有ベクトルは1でなければなりません)。

同じ行列をWolfram Alphaに差し込むと、実際の固有値の固有ベクトル(-0.0474067, -0.998724, 0.0174109)が生成されます。この固有ベクトルによってin_matrixを乗算すると、期待どおり同じベクトルが生成されます。

>>> wolfram_vec = np.array([-0.0474067, -0.998724, 0.0174109]) 
>>> print in_matrix.dot(wolfram_vec) 
[-0.04740589 -0.99870688 0.01741059] 

ウォルフラム(正しい)固有ベクトルnumpyのが(sqrt(2), sqrt(2), 0)を与えるのに対し、負のY軸に対応します。

ボトムライン:numpyの固有ベクトルは固有ベクトルではありませんが、ウォルフラムアルファ固有ベクトルは正しい(それを見ます)。誰もこれに光を当てることはできますか?

これは、Mac OS XでのPython 2.7.10の標準インストールと、Centos 6.8でのPython 2.7.8のカスタマイズインストールでテストされています。

+0

行と列が正しく表示されていますか? ( 'evecs [2]'の値は、列ではなく行であるように見えます) –

+0

あなたはそうです、これでした。ドキュメントを正しく読まないと、通常はPythonを読み書きしません。ありがとう! – helen

答えて

1

ドキュメントを引用:

v : (..., M, M) array 
    The normalized (unit "length") eigenvectors, such that the 
    column ``v[:,i]`` is the eigenvector corresponding to the 
    eigenvalue ``w[i]``. 

あなたが列、evecs[:, i]、ない行、evecs[i]を抽出する必要があります。

In [30]: evecs[:, 2] 
Out[30]: array([-0.04740673+0.j, -0.99872392+0.j, 0.01741090+0.j]) 

これは、あなたがWolframベクトルと同じことを認識するかもしれません。

In [31]: in_matrix.dot(evecs[:, 0]) - evals[0] * evecs[:, 0] 
Out[31]: 
array([ 5.55111512e-17 +1.11022302e-16j, 
     -7.11236625e-17 +1.38777878e-17j, 2.22044605e-16 -1.66533454e-16j]) 

In [32]: in_matrix.dot(evecs[:, 1]) - evals[1] * evecs[:, 1] 
Out[32]: 
array([ 5.55111512e-17 -1.11022302e-16j, 
     -7.11236625e-17 -1.38777878e-17j, 2.22044605e-16 +1.66533454e-16j]) 

In [33]: in_matrix.dot(evecs[:, 2]) - evals[2] * evecs[:, 2] 
Out[33]: array([ 3.46944695e-17+0.j, 4.44089210e-16+0.j, 3.15719673e-16+0.j]) 

ここで、それぞれの結果は[0、0、0]であり、期待精度内にあります。

+0

ありがとうございました!とても簡単! – helen

関連する問題