Diagonalisierung dichter schlecht konditionierter Matrizen

10

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

Leigh
quelle
2
Mit welcher Routine diagonalisieren Sie Ihre realen symmetrischen Matrizen? Und inwiefern ist die Eigenwertzerlegung ungenau?
Jack Poulson
Hier ist eine Idee im Zusammenhang mit Arnolds Antwort: Führen Sie eine Cholesky-Zerlegung Ihrer SPD-Matrix durch und suchen Sie dann die Singularwerte des soeben erhaltenen Cholesky-Dreiecks, möglicherweise unter Verwendung eines Algorithmus vom Typ dqd, um die Genauigkeit zu erhalten.
JM
1
@JM: Die Bildung der Cholesky-Zerlegung einer numerisch singulären positiv-definitiven Matrix ist mit der üblichen Methode numerisch instabil, da man wahrscheinlich auf negative Drehpunkte stößt. (ZB schlägt Matlabs Chol (A) normalerweise fehl.) Man müsste sie auf Null setzen und die entsprechenden Zeilen der Faktoren vernichten. Auf diese Weise können Sie den numerischen Nullraum zuverlässig abrufen.
Arnold Neumaier
@Arnold, wenn der Speicher dient, gibt es Anpassungen der Cholesky , die für die Fälle , symmetrische Verschwenkung verwenden , bei denen die Matrix positiv ist halb -definite (oder nahezu so). Vielleicht könnten diese verwendet werden ...
JM
@JM: Man muss nicht schwenken, um den semidefiniten Fall zu lösen. Das Rezept, das ich gegeben habe, ist genug. Ich wollte nur darauf hinweisen, dass man die Standard-Dosenprogramme nicht verwenden kann, sondern sie selbst modifizieren muss.
Arnold Neumaier

Antworten:

7

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.

Arnold Neumaier
quelle
[0,BT;B,0]
2
@ JackPoulson: Der Punkt ist, dass die bidiagonale Form kleine Singularwerte viel besser bestimmt. Die zugehörige symmetrische tridiagonale Form hat Nullen auf der Diagonale, die durch die bidiagonale Reduktion auf diagonal erhalten bleiben, jedoch nicht durch QR, das auf die Tridiagonal angewendet wird.
Arnold Neumaier
1
Referenz? Jacobis Methode ist bekanntermaßen sehr genau (wenn auch langsam).
Jack Poulson
@ JackPoulson: Versuchen Sie und sehen Sie. Demmel & Kahan, Genaue Singularwerte von Bidiagonalmatrizen, 202.38.126.65/oldmirrors/ftp.netlib.org/lapack/lawnspdf/…
Arnold Neumaier
[0,BT;B,0]
1

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

Leigh
quelle
Ich habe es nicht getestet, aber es gibt eine MATLAB-Implementierung hier: groups.google.com/forum/?fromgroups#!msg/sci.math.num-analysis/…
Jack Poulson
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. Wofür benötigen Sie die Eigenwerte?
Arnold Neumaier
@ArnoldNeumaier: Ich habe einige Tests in MATLAB mit Eigenwerten im Bereich von [0,1] durchgeführt, wobei ein Eigenwert manuell auf Werte wie 6.3e-16 eingestellt wurde, und die SVD-Routine von Octave (basierend auf dgesvd, die die Reduktion auf bidiagonal und verwendet dann nimmt QR) diese Werte viel genauer auf als Octaves eig. Der verknüpfte Jacobi-Code scheint zu langsam zu sein, selbst auf Matrizen mit bescheidener Größe.
Jack Poulson
@ JackPoulson: Ja. Aber Leigh scheint sich über mehrere sehr kleine Eigenwerte zu beklagen , und ihre Eigenvektoren werden selten die entworfenen sein, sondern sich frei mischen, unabhängig davon, welche Methode verwendet wird. Und positive, sehr kleine positive Werte (kleiner als 1e-16) werden natürlich Null sein.
Arnold Neumaier
@ArnoldNeumaier hat Recht, dass ich mehrere sehr kleine Eigenwerte finde, was das Problem vermutlich verschlimmert. Ich wusste nicht (obwohl es im Nachhinein offensichtlich ist), dass Eigenwerte kleiner als 1e-16 im Gleitkomma Null sind. Ich denke, obwohl die Nummer gespeichert werden kann, tritt beim Hinzufügen zu einer größeren Nummer ein Rundungsfehler auf. Die Eigenvektoren sagen mir, ob ein bestimmtes Problem lösbar ist. Der Eigenvektor ermöglicht die Zerlegung des Problems in lösbare und nicht lösbare Teile. Wenn ich durch die Präzision grundlegend eingeschränkt bin, können Sie dann Pakete für eine schnellere Lösung empfehlen?
Leigh