2016-05-18 4 views
2

私は円形行列の固有値と固有ベクトルを計算するためにnumpyを使用しています。ここに私のコードがあります(j = 1,2 ... 6のHjiはあらかじめ定義されています):numpyは循環行列の不正確な固有ベクトルを返すようです

>>> import numpy as np 
>>> H = np.array([H1i, H2i, H3i, H4i, H5i, H6i]) 
>>> H 
array([[ 0., 1., 0., 0., 0., 1.], 
     [ 1., 0., 1., 0., 0., 0.], 
     [ 0., 1., 0., 1., 0., 0.], 
     [ 0., 0., 1., 0., 1., 0.], 
     [ 0., 0., 0., 1., 0., 1.], 
     [ 1., 0., 0., 0., 1., 0.]]) 
>>> from numpy import linalg as LA 
>>> w, v = LA.eig(H) 

>>> w 
array([-2., 2., 1., -1., -1., 1.]) 
>>> v 
array([[ 0.40824829, -0.40824829, -0.57735027, 0.57732307, 0.06604706, 
     0.09791921], 
     [-0.40824829, -0.40824829, -0.28867513, -0.29351503, -0.5297411 , 
     -0.4437968 ], 
     [ 0.40824829, -0.40824829, 0.28867513, -0.28380804, 0.46369403, 
     -0.54171601], 
     [-0.40824829, -0.40824829, 0.57735027, 0.57732307, 0.06604706, 
     -0.09791921], 
     [ 0.40824829, -0.40824829, 0.28867513, -0.29351503, -0.5297411 , 
     0.4437968 ], 
     [-0.40824829, -0.40824829, -0.28867513, -0.28380804, 0.46369403, 
     0.54171601]]) 

固有値は正しいです。しかし、固有ベクトルのために、私は彼らがそうでないことを意味する(V [2,5] = -1.69601044e-01を確認してください)あなたは非対角項がある見ることができる線形独立

>>> V = np.zeros((6,6)) 
>>> for i in range(6): 
...  for j in range(6): 
...   V[i,j] = np.dot(v[:,i], v[:,j]) 
... 

>>> V 
array([[ 1.00000000e+00, -2.77555756e-17, -2.49800181e-16, 
     -3.19189120e-16, -1.11022302e-16, 2.77555756e-17], 
     [ -2.77555756e-17, 1.00000000e+00, -1.24900090e-16, 
     -1.11022302e-16, -8.32667268e-17, 0.00000000e+00], 
     [ -2.49800181e-16, -1.24900090e-16, 1.00000000e+00, 
     -1.52655666e-16, 8.32667268e-17, -1.69601044e-01], 
     [ -3.19189120e-16, -1.11022302e-16, -1.52655666e-16, 
      1.00000000e+00, 1.24034735e-01, -8.32667268e-17], 
     [ -1.11022302e-16, -8.32667268e-17, 8.32667268e-17, 
      1.24034735e-01, 1.00000000e+00, -1.66533454e-16], 
     [ 2.77555756e-17, 0.00000000e+00, -1.69601044e-01, 
     -8.32667268e-17, -1.66533454e-16, 1.00000000e+00]]) 
>>> 

ではありませんがわかりました線形独立ベクトル。これはエルミート行列なので、その固有ベクトルはどのように依存することができますか?ところで

、私もそれを計算するためにMATLABを使用して、それはあなたが別の関数を使用する必要があり正しい値にエルミート対称行列の場合

V = 

    0.4082 -0.2887 -0.5000 0.5000 0.2887 -0.4082 
    -0.4082 -0.2887 0.5000 0.5000 -0.2887 -0.4082 
    0.4082 0.5774   0   0 -0.5774 -0.4082 
    -0.4082 -0.2887 -0.5000 -0.5000 -0.2887 -0.4082 
    0.4082 -0.2887 0.5000 -0.5000 0.2887 -0.4082 
    -0.4082 0.5774   0   0 0.5774 -0.4082 


D = 

    -2.0000   0   0   0   0   0 
     0 -1.0000   0   0   0   0 
     0   0 -1.0000   0   0   0 
     0   0   0 1.0000   0   0 
     0   0   0   0 1.0000   0 
     0   0   0   0   0 2.0000 
+1

オフ対角の項はおおよそ0.0000000000000001です。浮動小数点演算の不正確さに起因する単なる「丸め誤差」です。 – BrenBarn

+0

@BrenBarn。申し訳ありませんが、あなたはV [2,5] = -1.69601044e-01を確認できます。 – Aaron

答えて

1

を返す:eighを。

import numpy as np 
from numpy import linalg as LA 

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

w, v = LA.eigh(H) 

V = np.zeros((6,6)) 
for i in range(6): 
    for j in range(6): 
     V[i,j] = np.dot(v[:,i], v[:,j]) 

w 
Out[19]: array([-2., -1., -1., 1., 1., 2.]) 

v 
Out[20]: 
array([[-0.40824829, -0.57735027, 0.  , 0.  , 0.57735027, 
     0.40824829], 
     [ 0.40824829, 0.28867513, -0.5  , -0.5  , 0.28867513, 
     0.40824829], 
     [-0.40824829, 0.28867513, 0.5  , -0.5  , -0.28867513, 
     0.40824829], 
     [ 0.40824829, -0.57735027, 0.  , 0.  , -0.57735027, 
     0.40824829], 
     [-0.40824829, 0.28867513, -0.5  , 0.5  , -0.28867513, 
     0.40824829], 
     [ 0.40824829, 0.28867513, 0.5  , 0.5  , 0.28867513, 
     0.40824829]]) 

V 
Out[21]: 
array([[ 1.00000000e+00, 8.32667268e-17, 2.77555756e-17, 
      8.32667268e-17, -2.08166817e-16, 0.00000000e+00], 
     [ 8.32667268e-17, 1.00000000e+00, 5.55111512e-17, 
      5.55111512e-17, -2.22044605e-16, -1.11022302e-16], 
     [ 2.77555756e-17, 5.55111512e-17, 1.00000000e+00, 
      0.00000000e+00, 2.77555756e-17, 1.11022302e-16], 
     [ 8.32667268e-17, 5.55111512e-17, 0.00000000e+00, 
      1.00000000e+00, 8.32667268e-17, 5.55111512e-17], 
     [ -2.08166817e-16, -2.22044605e-16, 2.77555756e-17, 
      8.32667268e-17, 1.00000000e+00, 0.00000000e+00], 
     [ 0.00000000e+00, -1.11022302e-16, 1.11022302e-16, 
      5.55111512e-17, 0.00000000e+00, 1.00000000e+00]]) 
+0

助けてくれてありがとう。しかし、LA.eigがなぜ機能しないのですか? – Aaron

+0

@Aaron計算にはさまざまなアルゴリズムが使用されています。 numpy docs: 'eig'は" _geev LAPACKルーチン "と" eigh' - "LAPACKルーチン_syevd、_heevdを使って実装されています"。インテルのサイト[Symmetric](https://software.intel.com/en-us/node/521045)と[Nonsymmetric](https://software.intel.com/en-us)で読むことのできる相違点/ node/521079)固有値問題。詳細については、[Lapack](http://www.netlib.org/lapack/lug/)を参照してください。 –

+0

返信いただきありがとうございます。 – Aaron

2

結果はeigによって返されます。これはeigの出力は、一般的な対角化行列に保持する形態v * diag(w) * inv(v)、入力マトリックスの分解に対応すること

np.allclose(v.dot(np.diag(w)).dot(LA.inv(v)),H) 
True 

注によって見ることができます。 eigは特別な構造を持たないものとしてHを扱うので、返された固有ベクトルは特別な構造、例えば直交を有することは期待されない。 (線形独立性と直交性を混同しないでください - vの列が実際に単に非ゼロLA.det(v)によって検証することができるよう線形独立である。)

機能eighはすなわち、入力行列がエルミートであることを知って、より便利を返します、固有ベクトルの直交セット。

+0

ありがとうございます。私は、線形独立性と直交性の定義を誤解しました。エルミート行列の固有ベクトルは、互いに独立した線形でなければならないが、線形独立性は直交性を意味しない(直交性は線形独立性を意味する)。 – Aaron

関連する問題