RL-Zerlegung - Unklarheiten
-
Guten Tag,
als Aufgabe habe ich bekommen, eine Matrix per Gauß berechnen zu lassen.
Der Ausgangsquellcode sieht so aus:public static double[] solve(double[][] A, double[] y) { int n = A.length; double[] z = y, x = new double[n]; // decompose A into left and right triangular // matrix A = L*R. lrdecompose(A); // forward elimination: R*x=:z => L*z = y => z for(int i = 0; i<n; i++) { for(int j = 0; j<i; j++) { z[i] -= A[i][j]*z[j]; } } // backward elimination: z=R*x => x for (int j = n - 1; j >= 0; j--) { for (int i = j + 1; i < n; i++) { z[j] -= A[j][i] * x[i]; } x[j] = z[j] / A[j][j]; } return x; }
Irgendwie verstehe ich nicht was lrdecompose(); machen soll.
Immerhin kommen bei der RL-Zerlegung ja 2 Matrizen (Links und Rechts) raus und nicht wieder die Matrix A mit einem Vektor x?
Kann mich da jemand aufklären und ggf. an eine Seite weiterleiten, wo beschrieben wird, was da genau geschieht/gerechnet werden muss?
Auch bei wikipedia wird die Matrix in 2 Matrizen aufgeteilt.Liebe Grüße,
wadestone.
-
Hallo Du,
ich bin jetzt nicht der Profi, aber die untere Dreiecksmatrix (L) hat auf der Hauptdiagonalen nur Einsen, daher kann man beide Matrizen sozusagen in eine kombinieren, um Speicherplatz zu sparen.
-
Auch wenn ich nicht ganz verstehe wie du das meinst:
Sicher, dass es so gemacht wurde?
Was ist dann der Vektor x?
-
Entschuldigt ... x ist ja eigentlich klar.
Also statt das ganze in R und L aufzuteilen:
A = L * R| 1 2 3 | | 1 0 0 | | 1 2 3 | A = | 1 1 1 | = | 1 1 0 | * | 0 -1 -2 | = L * R | 3 3 1 | | 3 3 1 | | 0 0 -2 |
mache ich einfach:
| 1 2 3 | | 1 -1 -2 | | 3 3 -2 |
daraus?
Richtig soweit?
-
Ganz genau!
Aber das sind immer noch 2 einzelne Matrizen, bloß halt "in einer zusammengestopft, um Speicherplatz zu sparen".
-
Also, du hast da immer noch stehen
A*x=L*Rx=y
Und löst erstmal:
Lz = y (wobei L halt in der unteren linken hälfte von A gespeichert ist (die 1en musst Du Dir denken)
Danach löst Du dann
R*x = z (wobei R die obere Dreiecksmatrix von A ist)