8x8 Gleichung auflösen Gauss Seidel
-
Hall NG
Habe ein Problem eine 8x8 Matrix zu lösen in einer C++ Umgebung:
b=A*x
x=A\bErst Habe ich es mit dem Gauss Jordan versucht (R) und leider ungenaue
Resultate erhalten. Hier seht man gleich noch, welche Werte konstat
sind. Die letzte Spalte ist b.R = [
x(1) y(1) 1 0 0 0 -u(1)*x(1) -u(1)*y(1) u(1);
x(2) y(2) 1 0 0 0 -u(2)*x(2) -u(2)*y(2) u(2);
x(3) y(3) 1 0 0 0 -u(3)*x(3) -u(3)*y(3) u(3);
x(4) y(4) 1 0 0 0 -u(4)*x(4) -u(4)*y(4) u(4);
0 0 0 x(1) y(1) 1 -v(1)*x(1) -v(1)*y(1) v(1);
0 0 0 x(2) y(2) 1 -v(2)*x(2) -v(2)*y(2) v(2);
0 0 0 x(3) y(3) 1 -v(3)*x(3) -v(3)*y(3) v(3);
0 0 0 x(4) y(4) 1 -v(4)*x(4) -v(4)*y(4) v(4)]Als nächstes habe ich den Gauss Seidel Algorithmus getestet. Dieser
hat allg. bessere Stabilitätseigenschaften. Leider lieferte dieser gar
keine Resultate für meine Matrize.Hat jemand ein Tipp, welches Verfahren geeignet wäre?
Vielen Dank
Gruss Roger Merz
-
Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Mathematik verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Erklär mal kurz, wie du den Algorithmus implementiert hast? Benutzt du eine Pivot-Suche?
-
Also, da ich jemand bin, der das Rad selten neu erfindet:
http://slate.sourceforge.net/Damit löse ich sämtliche algebraischen Sachen. Dort werden Matrizen über diverse Algorithmen geknackt. Der Quellcode ist zugänglich, so dass es vielleicht lohnend ist, da mal rein zu schauen. Natürlich kannst du dich auch selbst dran versuchen, dann könnte es eine nützliche Anleitung sein, wie man evtl. ran gehen könnte.
Gruß
physici
-
Taurin schrieb:
Erklär mal kurz, wie du den Algorithmus implementiert hast? Benutzt du eine Pivot-Suche?
Hallo
Danke für die Antworten. Ich benutzte keine Pivot-Suche. Denke das könnte das Problem sein, denn als ich von einem Querpost auf
http://groups.google.ch/group/sci.math.num-analysis/browse_thread/thread/aa0769fb198a60ad?hl=de
einen Quellcode erhalten habe mit Gauss&Pivot hats funktioniert mit einer ausreichenden Genauigkeit als beim Elimationsverfahren von Gauss.Was mach denn die Pivot-Suche?
Merci
-
vor den eigentlichen schritten zeilen so tauschen, dass die eintraege in der resultierende transformationsmatrix betragsmaessig moeglichst klein sind. das verbessert die kondition des algorithmus, welche wiederum angbit, wie stark dieser auf abweichungen reagiert.
-
Du tauschst die Zeilen immer so, dass immer das betragsmäßig größte Element auf die Diagonale getauscht wird. Das verbessert die Kondition so, dass das Ergebnis der Rechnung (für die meisten Matrizen) eine vernünftige Genauigkeit hat.
Wenn das noch nicht ausreicht, kann man auch total Pivotisieren (also nach Spalten *und* Zeilen). Bis auf Sonderfälle braucht man das aber nicht, sondern verschenkt nur Rechenzeit.Nur nebenbei: Es gibt aber auch Matrizen, die so schlecht Konditioniert sind, dass man noch so viel Pivotsuche machen kann und trotzdem nur Murks entsteht.
Fausformel: Genauigkeit des Ergebnis = Genauigkeit der Rechnung * Kondition der Matrix. Bei Rechnung mit doubles hast du eine Genauigkeit von 2^(-52) ≈ 10^(-16).Wie gut bist du mit lin. Algebra / Nuemrik vertraut?
-
mit der pivotisierung gehts ganz gut. allerdings haben x6 und x7 ein sehr hohes gewicht und bei diesen variablen habe ich einen fehler von bis 5.0e-5. kann dies aber nachträglich noch korrigieren... thx4help@all
-
Mal aus Neugier: Wie korriegierst du den Fehler nachträglich?
-
nachiterieren vielleicht