Im Regelfall weicht die numerische Lösung eines linearen Gleichungssystems durch Rundungsfehler von der exakten Lösung ab. Diese Abweichung kann bei schlecht konditionierter Systemmatrix inakzeptabel groß sein. Mit Hilfe iterativer Verfahren, die meist mit dem englischen Begriff Iterative Refinement bezeichnet werden, lässt sich die numerische Lösung verbessern.

Grundverfahren

Bearbeiten

Zu lösen ist ein lineares Gleichungssystem

 

mit regulärer, jedoch schlecht konditionierter Systemmatrix   und rechter Seite  .

Die numerische Lösung ist fehlerbehaftet. Das kann so interpretiert werden, dass man ein Gleichungssystem

 

mit gestörter Systemmatrix   löst. Die Lösungen des originalen und des gestörten Gleichungssystems   bzw.   weichen um einen Korrekturterm   voneinander ab:

 

Setzt man   für   in die Originalgleichung ein erhält man

 .

Auflösen nach dem Korrekturterm   liefert:

 

Geht man davon aus, dass man die als Residuum bezeichnete rechte Seite   relativ genau berechnen kann, bei dem Lösen des linearen Gleichungssystems bzgl.   jedoch nur mit der gestörten Systemmatrix   rechnen kann, so erhält man das folgende iterative Verfahren:

  • Startwert:  
  • Für  :
  1. Berechne das Residuum   in hoher Genauigkeit.
  2. Berechne die Korrektur   als numerische Lösung des Gleichungssystems  
  3. Berechne die verbesserte numerische Lösung   des Originalsystems.
  4. Abbruch für hinreichend kleinen Korrekturterm   und hinreichend kleines Residuum  .

Das folgende Scilab-Programm demonstriert die iterative Lösungsverbesserung (das ist keine numerisch effiziente Implementation, sondern dient ausschließlich der Demonstration des Verfahrens):

// Eingangsdaten:

N = 10;	// Systemdimension
Cond = 1e7;	// Kondition der Systemmatrix
noise = 0.01;	// Störung durch LU-Zerlegung

maxIter = 10;	// Begrenzung der Anzahl der Iterationsschritte

epsilon = 1e-8; // Genauigkeit mit der die Lösung berechnet werden soll.

// Generierung der Problemdaten:
// Schlecht konditionierte Systemmatrix generieren:
[U,S,VT] = svd(rand(N,N));
logCond = log(Cond);
S =  exp(0:logCond/(N-1):logCond);
A = U * diag(S) * VT;
Anoisy = U * diag((1.0+noise*rand(1,N)).*S)*VT;

// Rechte Seite generieren:
b = rand(N,1);


// Eigentliches Verfahren "Iterative Refinement":

x = zeros(N,1);	// Startwert für Iteration

for i=1:maxIter do
  r = b - A*x;		// Berechnung des Residuums
  dx = Anoisy\r;	// Lösung des linearen Gleichungssystems für den Korrekturterm dx
			// (An dieser Stelle werden die Rundungsfehler bei der Lösung des
			//  linearen Gleichungssystems durch Rechnen mit der gestörten Matrix
			//  Anoisy simuliert.)
  x = x + dx;		// Verbesserung der numerischen Lösung des Originalproblems
  norm_dx = norm(dx);
  norm_r = norm(r);
  print( %io(2), i, norm_dx, norm_r );
			// Abbruchstest:
  if norm_dx + norm_r < epsilon then
    break;
  end;
end;

Anwendung

Bearbeiten

In der LAPACK-Routine dsgesv wird das oben vorgestellte Grundverfahren für Iterative Refinement zur schnellen Lösung linearer Gleichungssysteme eingesetzt. Als eingebetteter direkter Lösungsalgorithmus kommt dabei eine LR-Zerlegung mit einfacher Genauigkeit zum Einsatz, während die nicht so aufwendige Residuenberechnung mit doppelter Genauigkeit durchgeführt wird. Die LR-Zerlegung wird nur einmal durchgeführt und innerhalb der Iterationsschleife werden die gewonnenen Dreiecksmatrizen zur Lösung des linearen Gleichungssystems genutzt.

Weitere Verfahren

Bearbeiten

Iterative Lösungsverfahren für lineare Gleichungssysteme (wie zum Beispiel das PCG-Verfahren) sind für Iterative Refinement einsetzbar. Die numerische Lösung des Gleichungssystems mittels LR-Zerlegung oder Cholesky-Verfahren dient dann als Präkonditionierer.

Literatur

Bearbeiten
  • Germund Dahlquist, Ake Björck: Numerical Methods in Scientific Computing, Volume II. siam, Philadelphia 2007, [1].
  • W. H. Press, S. A. Teukolsky, W. T. Vetterling, B. P. Flannery: Nuerical Recipes in C. Second Edition, Cambridge University Press 1992, ISBN: 0 521 43108 5.

Kategorie:Numerische lineare Algebra