2017-10-12 11 views
1

私は、シフト反転モードを使用して、scipy.sparse.linalg.eigshで複素行列の固有値と固有ベクトルを見つけようとしています。行列の実数だけでは、spicy.linalg.eighソルバーと同じ結果になりますが、虚数部を追加すると固有値が異なることになります。小さな例:複雑な入力行列に対して間違った結果を返すScipy eigsh

import numpy as np 
from scipy.linalg import eigh 
from scipy.sparse.linalg import eigsh 

n = 10 
X = np.random.random((n, n)) - 0.5 + (np.random.random((n, n)) - 0.5) * 1j 
X = np.dot(X, X.T) # create a symmetric matrix 

evals_all, evecs_all = eigh(X) 
evals_small, evecs_small = eigsh(X, 3, sigma=0, which='LM') 

print(sorted(evals_all, key=abs)) 
print(sorted(evals_small, key=abs)) 

実際の場合には、最初の三つの固有値は同じであるのに対し、この場合の印刷は、例えば

[0.041577858515751132, -0.084104744918533481, -0.58668240775486691, 0.63845672501004724, -1.2311727737115068, 1.5193345703630159, -1.8652302423152105, 1.9970059660853923, -2.6414593461321654, 2.8624290667460293] 
[-0.017278543470343462, -0.32684893256215408, 0.34551438015659475] 

ためのものです。

私は密行列をスパースソルバーに渡していますが、これは単なる例として意図されています。

私はたぶんどこかに明白な何かが不足していますが、私はいくつかのヒントについては喜んでいます。ありがとうございました!

+2

物事をhermitianにするには 'conj()。T 'が必要です。 – percusse

答えて

0

scipyはnot checkingあなたの入力がhermitianの場合です。

リンクで提案されているようにそれをやって:

if not np.allclose(X, np.asmatrix(X).H): 
    raise ValueError('expected symmetric or Hermitian matrix') 

出力:

ValueError: expected symmetric or Hermitian matrix 

私はこれはまた、(あなたが見たもの、負の固有値によって示されていると思いますが、複雑なベースの数学は本当に私ではありません専門...)。

関連する問題