Ich versuche, einige dichte, schlecht konditionierte Matrizen zu diagonalisieren. Bei der Maschinengenauigkeit sind die Ergebnisse ungenau (Rückgabe negativer Eigenwerte, Eigenvektoren haben nicht die erwarteten Symmetrien). Ich habe auf die Eigensystem [] -Funktion von Mathematica umgestellt, um die willkürliche Genauigkeit zu nutzen, aber die Berechnungen sind extrem langsam. Ich bin offen für eine beliebige Anzahl von Lösungen. Gibt es Pakete / Algorithmen, die für schlecht konditionierte Probleme gut geeignet sind? Ich bin kein Experte für Vorkonditionierung, daher bin ich mir nicht sicher, wie viel dies helfen könnte. Ansonsten kann ich mir nur parallelisierte Eigenwertlöser mit beliebiger Genauigkeit vorstellen, aber ich kenne nichts anderes als Mathematica, MATLAB und C ++.
Um einige Hintergrundinformationen zum Problem zu geben, sind die Matrizen groß, aber nicht riesig (höchstens 4096 x 4096 bis 32768 x 326768). Sie sind real, symmetrisch und die Eigenwerte sind zwischen 0 und 1 (exklusiv) begrenzt, wobei viele Eigenwerte sehr nahe bei 0 und keine nahe bei 1 liegen. Die Matrix ist im Wesentlichen ein Faltungsoperator. Ich muss nicht alle meine Matrizen diagonalisieren, aber je größer ich werden kann, desto besser. Ich habe Zugriff auf Computercluster mit vielen Prozessoren und verteilten Computerfunktionen.
Vielen Dank
Antworten:
Berechnen Sie die SVD anstelle der spektralen Zerlegung. Die Ergebnisse sind in der exakten Arithmetik dieselben, da Ihre Matrix symmetrisch positiv definitiv ist, aber in der Arithmetik mit endlicher Genauigkeit erhalten Sie die kleinen Eigenwerte mit viel größerer Genauigkeit.
Edit: Siehe Demmel & Kahan, Accurate Singular Values of Bidiagonal Matrices, SIAM J. Sci. Stat. Comput. 11 (1990), 873 & ndash; 912.
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf
Edit2; Es ist zu beachten, dass keine Methode in der Lage ist, Eigenwerte aufzulösen, die kleiner sind als etwa die Norm mal der verwendeten Maschinengenauigkeit, da das Ändern eines einzelnen Eintrags um eine ulp bereits einen kleinen Eigenwert um so viel ändern kann. Daher ist es angemessen, Null-Eigenwerte anstelle von sehr kleinen zu erhalten, und keine Methode (außer mit höherer Genauigkeit zu arbeiten) entwirrt die entsprechenden Eigenvektoren, sondern gibt nur eine Basis für den gemeinsamen numerischen Nullraum zurück.
quelle
Vielen Dank für diesen Vorschlag. Ich habe den SVD-Befehl von Mathematica ausprobiert, aber ich bekomme keine merkliche Verbesserung (es fehlen immer noch geeignete Symmetrien, 'Eigenwerte' sind fälschlicherweise Null, wenn sie zuvor fälschlicherweise negativ waren). Vielleicht müsste ich einen der oben beschriebenen Algorithmen anstelle einer integrierten Funktion implementieren? Ich würde wahrscheinlich vermeiden wollen, mir die Mühe zu machen, eine bestimmte Methode wie diese zu verwenden, es sei denn, ich war mir im Voraus sicher, dass sie eine signifikante Verbesserung bieten würde.
@JackPoulson, ich habe das Papier über Jacobis Methode, auf die Sie verwiesen haben, überflogen und es sieht vielversprechend aus. Können Sie oder jemand einen guten Weg empfehlen, um Jacobis Methode zum Auffinden von Eigensystemen zu implementieren? Ich vermute, dass es extrem langsam wäre, wenn ich es selbst codieren würde (in MATLAB).
quelle