2017-10-12 81 views
1

我想用scipy.sparse.linalg.eigsh使用shift-invert模式找到複雜矩陣的特徵值和特徵向量。在矩陣中只有實數,我可以得到與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

你需要'conj()。T'來製造厄米特。 – percusse

回答

0

scipy是not checking您的輸入,如果它是厄米特。

做它喜歡在鏈接建議:

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

輸出:

ValueError: expected symmetric or Hermitian matrix 

我想這也被你看那些負本徵值表示(但基於複雜的數學真的不是我的專業...)。