cg, das kein cg ist (cg ohne A) | ||||||||
---|---|---|---|---|---|---|---|---|
schrittweise Iteration Iteration auf einmal |
random Zahlen definite Matrix |
vorkonditioniert : kein Diagonale(Jakobi) Tridiagonalmatrix |
||||||
Zeilen | Startfaktor | weniger Multiplikationen ( 4 n pro Iteration ) Residuum nur auf delta x | ||||||
Dieses Verfahren konvergiert wie ein cg. |
A x = b | b[..] | X 1 | X 2 | X 3 | X 4 | X 5 | X 6 | X 7 | X 8 | X 9 | X 10 |
x[..] | |||||||||||
Zeile 1 | |||||||||||
Zeile 2 | |||||||||||
Zeile 3 | |||||||||||
Zeile 4 | |||||||||||
Zeile 5 | |||||||||||
Zeile 6 | |||||||||||
Zeile 7 | |||||||||||
Zeile 8 | |||||||||||
Zeile 9 | |||||||||||
Zeile 10 | |||||||||||
Iteration Schritt | Aktuelle Iterations-Werte | ||||||||||
Beträge | alpha: | beta: | lamda: | ||||||||
X 1 | X 2 | X 3 | X 4 | X 5 | X 6 | X 7 | X 8 | X 9 | X 10 | ||
Y/Yv | |||||||||||
Betrag: | Y 1 | Y 2 | Y 3 | Y 4 | Y 5 | Y 6 | Y 7 | Y 8 | Y 9 | Y 10 | |
Y2 | |||||||||||
Y aus deltaX | |||||||||||
vorKon-D |
Erklärung:
A x = b , A symmetrisch, Residuum y i =Ax i -b Iterationsidee :
i * delta y i -1
=> beta -= (y i * delta y i - 1 ) / (delta x i * delta y i - 1 )
Die Residuen (y) sind nicht mehr orthogonal wie beim gewöhnlichen cg,
sondern ergeben, ebenso wie die Produkte delta x i * A * delta x k , eine Tridiagonal-Matrix.
Pro Iteration sind, wie oben beschrieben, außer der Residuen-Auswertung, pro Iteration 6 n + konst. Multiplikationen zu betätigen.
Als Start-beta wird null genommen . Als Start-x ist ein optimaler Wert ( = lamda ) nicht geeignet,
weil dann die Iteration abbricht.
Es wird daher dieser Wert mit einem Faktor ungleich 1 multipliziert.
Wegen der "Tridiagnonalität" ergibt sich der Zähler von alpha zum (negativen) Nenner des nächsten betas.
=> pro Iteration 5 n + konst. Multiplikationen
Von diesem Zähler < delta x * y (i) > ist der Faktor: delta x = alpha ( i - 1 ) * p ( i - 1 )
Er ergibt sich also zu alpha ( i - 1 ) * y ( i - 1 ) * y( i ),
weil y ( i ) * delta x ( i -1 ) = 0
y ( i - 1 ) * y( i ) ist auch der Zähler von beta , wegen der Tridiagonalität der Residuen.
Der Nenner von alpha (delta y *p) ist komplizierter:
Mit w = y * y und v = y ( i ) * y ( i - 1 ) und az =alpha( i-1 ) * v (Zähler von alpha)
Nenner = delta y * y = w - v + beta( i ) *alpha( i - 1 ) * ( v - w ( i - 1 ) - beta( i - 1 ) * az ( i - 1) )
Wer will, kann nachrechnen, vielleicht geht das auch einfacher!
=> pro Iteration 4n + konst. Multiplikationen, inklusive y * y für die Betragsbestimmung des Residuums.
Das Verfahren funktioniert auch nicht, wenn der Startfaktor dem, des normalen cg entspricht:
Da ist alpha0 = - (y0 * y0 ) / ( A p *y0) , y0 = Residum für x = 0 -> y0 = - b.
y( i ) * y ( i - 1) = 0 beim normalen cg.
Das optimale alpha = - (y * Ap ) / ( A p *Ap).
Gute Ergebnisse erhält man für alpha0 nahe dem optimalen Wert (ca 90- 99%).
Weiter kann man Rundungsfehler herabsetzen, wenn man das Residuum nur mir deltaX berechnet.
Dafür muss man den Vektor b jedesmal um delta y verkleinern.
Weil die Matrix A, außer bei der Residuenauswertung, sonst nicht benutzt wird,
ist dieses cg auch für nichtlineare symmetrische Probleme geeignet
(z.B. nichtlineare Ausgleichsrechnung).
Man muss nur beta wieder null setzen, wenn die Rechnung aus dem Ruder läuft.
Für nichtlineare Probleme ist die ursprüngliche Methode mit 6n Multiplikationen pro Iteration vorzuziehen.
Im eindimensionalen Fall, da entsprechen diese Formeln der Sekantenmethode.
Berechnungen: