Ich beabsichtige, Ax = b zu lösen, wobei A eine komplexe, spärliche, unsymmetrische und stark schlecht konditionierte (Bedingungsnummer ~ 1E + 20) quadratische oder rechteckige Matrix ist. Ich konnte das System mit ZGELSS in LAPACK genau lösen. Mit zunehmenden Freiheitsgraden in meinem System dauert es jedoch lange, das System auf einem PC mit ZGELSS zu lösen, da die Sparsity nicht ausgenutzt wird. Kürzlich habe ich SuperLU (unter Verwendung von Harwell-Boeing-Speicher) für dasselbe System ausprobiert, aber die Ergebnisse waren für die Bedingungsnummer> 1E + 12 ungenau (ich bin nicht sicher, ob dies ein numerisches Problem beim Schwenken ist).
Ich bin eher geneigt, bereits entwickelte Löser zu verwenden. Gibt es einen robusten Löser, der das erwähnte System schnell (dh unter Ausnutzung der Sparsity) und zuverlässig (angesichts der Bedingungsnummern) lösen kann?
__float128
Antworten:
Wenn Sie ZGELSS verwenden, um dieses Problem zu lösen, verwenden Sie die abgeschnittene Singularwertzerlegung, um dieses äußerst schlecht konditionierte Problem zu regulieren. Es ist wichtig zu verstehen, dass diese Bibliotheksroutine nicht versucht, eine Lösung der kleinsten Quadrate für , sondern versucht, eine Lösung zu finden, die minimiert gegen die Minimierung von. ‖ x ‖ ‖ A x - b ‖A x = b ∥ x ∥ ∥ A x - b ∥
Beachten Sie, dass der an ZGELSS übergebene Parameter RCOND verwendet werden kann, um anzugeben, welche Singularwerte in die Berechnung der Lösung einbezogen und von dieser ausgeschlossen werden sollen. Jeder Singularwert kleiner als RCOND * S (1) (S (1) ist der größte Singularwert) wird ignoriert. Sie haben uns nicht mitgeteilt, wie Sie den RCOND-Parameter in ZGELSS eingestellt haben, und wir wissen nichts über den Rauschpegel der Koeffizienten in Ihrer Matrix oder auf der rechten Seite Daher ist es schwer zu sagen, ob Sie ihn verwendet haben eine angemessene Menge an Regularisierung. bEIN b
Sie scheinen mit den regulierten Lösungen, die Sie mit ZGELSS erhalten, zufrieden zu sein. Es scheint also, dass die Regularisierung durch die abgeschnittene SVD-Methode erfolgt (die eine minimale -Lösung unter den Lösungen mit den kleinsten Quadraten findet, die minimieren über den Raum von Lösungen, die von den Singularvektoren überspannt werden, die den Singularwerten zugeordnet sind, die größer als RCOND * S (1) sind, ist für Sie zufriedenstellend. ‖ A x - b ‖∥ x ∥ ∥ A x - b ∥
Ihre Frage könnte wie folgt umformuliert werden: "Wie kann ich effizient regulierte Lösungen für kleinste Quadrate für dieses große, spärliche und sehr schlecht konditionierte lineare Problem der kleinsten Quadrate erhalten?"
Meine Empfehlung wäre, eine iterative Methode (wie CGLS oder LSQR) zu verwenden, um das explizit regulierte Problem der kleinsten Quadrate zu minimieren
Dabei wird der Regularisierungsparameter so angepasst, dass das Problem der gedämpften kleinsten Quadrate gut konditioniert ist und Sie mit den resultierenden regulierten Lösungen zufrieden sind.α
quelle
Jed Brown hat bereits in den Kommentaren zu der Frage darauf hingewiesen, aber es gibt wirklich nicht viel, was Sie mit üblicher doppelter Genauigkeit tun können, wenn Ihre Bedingungsnummer groß ist: In den meisten Fällen erhalten Sie wahrscheinlich keine einzige Ziffer der Genauigkeit in Ihre Lösung und, schlimmer noch, Sie können es nicht einmal sagen, weil Sie den Rest, der Ihrem Lösungsvektor entspricht, nicht genau auswerten können. Mit anderen Worten: Es ist keine Frage, welchen linearen Löser Sie wählen sollten - kein linearer Löser kann für solche Matrizen etwas Nützliches tun.
Solche Situationen treten normalerweise auf, weil Sie eine ungeeignete Basis wählen. Zum Beispiel erhalten Sie solche schlecht konditionierten Matrizen, wenn Sie die Funktionen als Grundlage für eine Galerkin-Methode wählen. (Dies führt zu der Hilbert-Matrix, die notorisch schlecht konditioniert ist.) Die Lösung besteht in solchen Fällen nicht darin, zu fragen, welcher Löser das lineare System lösen kann, sondern zu fragen, ob es bessere Basen gibt, die verwendet werden können. Ich möchte Sie ermutigen, dasselbe zu tun: Denken Sie darüber nach, Ihr Problem neu zu formulieren, damit Sie nicht mit solchen Matrizen enden.1,x,x2,x3,...
quelle
Der einfachste / schnellste Weg, um schlecht konditionierte Probleme zu lösen, besteht darin, die Genauigkeit der Berechnungen (durch rohe Gewalt) zu erhöhen. Eine andere (aber nicht immer mögliche) Möglichkeit besteht darin, Ihr Problem neu zu formulieren.
Möglicherweise müssen Sie die vierfache Genauigkeit (34 Dezimalstellen) verwenden. Obwohl in einem Kurs 20 Ziffern verloren gehen (aufgrund der Bedingungsnummer), erhalten Sie immer noch 14 korrekte Ziffern.
Wenn es von Interesse ist, sind jetzt auch spärliche Löser mit vierfacher Genauigkeit in MATLAB verfügbar.
(Ich bin der Autor der genannten Toolbox).
quelle