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!
Sie brauchen 'conj(). T', um Dinge hermitescher zu machen. – percusse