Die Verfahren

ItVerfTest1Matlab bietet 9 verschiedene Verfahren für die iterative Lösung linearer Gleichungssysteme

AxGleichB16

an. Das nebenstehend zu sehende Script ItVerfTest1.m zeigt sie alle mit der Standardaufruf-Variante, bei der nur die Koeffizientenmatrix A des Gleichungssystems und der Vektor der rechten Seite b übergeben werden müssen, ansonsten werden voreingestellte Standardwerte benutzt.

Für dieses kleine Beispiel liefern alle Verfahren die korrekte Lösung ab, siehe "Testrechnungen mit iterativen Verfahren (1)". Für solche kleinen Systeme sind aber die iterativen Verfahren nicht gedacht (siehe "Direkte Verfahren vs. Iterationsverfahren").

Versagen der Verfahren bei Standardaufruf, Korrektur durch mehr Iterationsschritte

Schon für nicht unwesentlich größere Systeme als in dem oben zu sehenden akademischen Beispiel (hier ein Beispiel mit 33 Gleichungen) versagen alle Verfahren mit dem Standardaufruf, bei dem maximal 20 Iterationsschritte vorgesehen sind, was nicht einmal ausreicht, um eine grobe Näherung zu erzielen.

Man kann zunächst eine Verbesserung durch Erhöhung der Anzahl der zugelassenen Iterationsschritte erreichen. Wenn man z. B. bei einem Gleichungssystem mit m Gleichungen 2m Iterationsschritte zulässt (bei dem Beispiel mit 33 Gleichungen also anstatt 20 nun 66 Iterationen), dann verbessert sich die Situation (in dem zitierten Beispiel liefern immerhin 5 von 9 Verfahren brauchbare Ergebnisse ab). Aber befriedigend ist die Situation damit nicht, zumal bei größeren Systemen auch diese Maßnahme erfolglos sein kann. Weil die Anzahl zugelassener Iterationsschritte (außer bei gmres) der 4. zu übergebene Parameter ist, muss auch der 3. Parameter (Toleranz für die Norm des Restvektors) angegeben werden (Default-Wert: 10-6). Der Aufruf der Function pcg würde dann z. B. so aussehen:

x = pcg (A , b , 1e-6 , m*2)

Versagen der Verfahren bei Standardaufruf, Verbesserung durch Präkonditionierung

Für praxisrelevante Systeme ist eine weitere Maßnahme zur Konvergenzverbesserung beinahe unerlässlich: Präkonditionierung verändert das Gleichungssystem in dem Sinne, dass sich die Lösung nicht ändert, die Konvergenz der iterativen Verfahren aber beschleunigt wird. Alle 9 Verfahren, die Matlab anbietet, sind dafür vorbereitet. Dafür müssen ihnen geeignete Präkonditionierer (Matrizen) als 5. bzw. 5. und 6. Parameter übergeben werden. Hier muss also der Anwender wissen, wie er solche Matrizen erzeugt, vgl. hierzu z. B. "Testrechnungen mit Präkonditionierung mit Matlab" und "Test: Präkonditionierung mit Incomplete Cholesky".

Vorsicht!

Die Standard-Variante für den Aufruf der iterativen Verfahren zur Lösung linearer Gleichungssysteme (nur Übergabe der Koeffizientenmatrix und des Vektors der rechten Seite) führt bei nur ganz wenigen kleinen Systemen zum Erfolg. Auch die Erhöhung der Anzahl zugelassener Iterationen bringt oft nicht den erhofften Erfolg. Präkonditionierung, die eine Vorleistung erfordert, ist in der Regel unabdingbar, garantiert aber auch nicht immer den Erfolg.

Man lasse sich auch nicht täuschen vom Namen des pcg-Verfahrens, der für "Preconditioned conjugate gradient" steht. Auch diese Function arbeitet nicht automatisch mit Präkonditionierung, sondern nur, wenn ihr (wie bei den anderen Verfahren) ein Präkonditionierer übergeben wird.

Liebe Matlab-Entwickler,

die Probleme, die in den Algorithmen der iterativen Verfahren stecken, kann man natürlich auch durch geschickteste Programmierung nicht beseitigen, aber man kann sie abschwächen. Und ...

  • ... ist es wirklich sinnvoll, dass der Standardwert für die Anzahl zugelassener Iterationen so klein ist, und ...
     
  • ... könnte nicht die Skalierung (der Aufwand dafür ist unbedeutend) als einfache Variante der Präkonditionierung der Standard für alle Verfahren sein (gegebenenfalls mit der Möglichkeit, diese Präkonditionierung zu unterdrücken)?