2017-10-12 7 views
1

Ich versuche die Eigenwerte und Eigenvektoren einer komplexen Matrix mit scipy.sparse.linalg.eigsh zu finden, indem ich den Shift-Invert-Modus verwende. Mit nur reellen Zahlen in der Matrix bekomme ich das gleiche Ergebnis für den würzigen. Linalg.eigh Solver, aber wenn ich die Imaginärteile addiere, divergieren die Eigenwerte. Ein kleines Beispiel:Scipy eigsh gibt falsche Ergebnisse für komplexe Eingabematrix zurück

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)) 

Die Drucke sind in diesem Fall zum Beispiel

[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] 

während im realen Fall sind die ersten drei Eigenwerte identisch sind.

Ich bin mir bewusst, dass ich eine dichte Matrix an den Sparse Solver übergeben, aber das ist nur als ein Beispiel gedacht.

Ich vermisse wahrscheinlich irgendwo etwas Offensichtliches, aber ich würde mich über einige Hinweise freuen, wo ich hinschauen sollte. Vielen Dank!

+2

Sie brauchen 'conj(). T', um Dinge hermitescher zu machen. – percusse

Antwort

0

scipy ist not checking Ihre Eingabe, wenn es hermitian ist.

tun es, wie in dem Link vorgeschlagen:

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

Ausgänge:

ValueError: expected symmetric or Hermitian matrix 

Ich denke, das auch von den negativen Eigenwerte Sie sehen angezeigt (aber komplex-basierten Mathematik ist wirklich nicht meine Spezialität...).

Verwandte Themen