Sie sind hier: Numerik > Lösung linearer Gleichungssysteme > Einfacher Gauß-Algorithmus

Einfacher Gauß-Algorithmus

Samstag 02. Dezember 2006 von
Simon Praetorius
Um ein System linearer Gleichungen zu lösen, lernt man in der Schule meist als erstes die eine Gleichung nach einer Variablen aufzulösen und dann in die anderen Gleichungen einzusetzen. Somit eliminiert man eine Variable aus allen anderen Gleichungen. Wenn man das mit den anderen Variablen auch macht, kann man mit reichlich Aufwand das Gleichungssystem lösen. Etwas mehr System in dieses Verfahren bringt man mit dem Gaußalgorithmus, bei dem zuerst die Gleichungen durch geschickte Aufaddierung in Stufenform gebracht werden und danach durch Rückwärtseinsetzen nach den einzelnen Variablen aufgelöst wird.

Mehr Informationen zum Algorithmus finden sich auf Wikipedia, oder Uni-Bielefeld.

matlab Code
  • A = input(' Matrix A eingeben: ');
  • b = input(' Vektor b eingeben: ');
  •  
  • n=length(b);
  •  
  • % In Dreiecksform umwandeln
  • for k=1:n-1
  • for i=k+1:n
  • if(A(k,k) == 0) then
  • error(' Es befinden sich 0-Elemente auf der Hauptdiagonalen ');
  • end
  • A(i,k) = A(i,k) / A(k,k);
  • b(i) = b(i) - b(k)*A(i,k);
  • for j=k+1:n
  • A(i,j) = A(i,j) - A(k,j)*A(i,k);
  • end
  • end
  • end
  •  
  • % Rueckwertssubstitution
  • x=zeros(n,1);
  • for i=n:-1:1
  • x(i) = (b(i)-A(i,i+1:n)*x(i+1:n)) / A(i,i);
  • end
  • x
Der Algorithmus hat ein paar Nachteile. Zum Beispiel löst er nicht alle Gleichungssystem, die theoretisch lösbar wären, denn wenn auf der Hauptdiagonalen Nullen stehen, kann dieser Algorithmus nichts damit anfangen. Als ein Beispiel wäre da z.B.
Ax=b mit A=[0,0,1; 0,1,0; 1,0,0]; b=[1;2;3] hat als Lösung x=[3;2;1]
Als Ausweg bietet sich der Gaußalgorithmus mit Pivotisierung an, bei dem die Zeilen/Spalten so vertauscht werden, dass das System mit dem standard Gaußalgorithmus gelöst werden kann.
Besucher: 30989 | Permalink | Kategorie: Numerik
Tags:

4 Kommentare

  1. Freitag 14.11.2008 21:53 von
    RomanPulver

    Hallo
    Ich muss für meine Schule den Gauss in Matlab programmieren und bin dabei auf Ihre Lösung gestossen. Mein Problem besteht darin dass ich nicht genau herausfinde wie ich die Matrix und den Vektor definieren muss, bzw. wieviele Zeilen und Spalten die Matrix und der Vektor haben muss. Bei mir bricht das Programm immer bei Stufe 15 oder 22 ab. Ich wäre sehr froh wenn mir jemand ein Zahlenbeispiel geben könnte.
    Herzlichen Dank.

    Freundliche Grüsse

    Roman Pulver

  2. Samstag 15.11.2008 17:01 von
    SimonPraetorius

    Die Matrix A muss natürlich quadratisch und regulär sein. Für regulär gibt es viele äquivalente Eigenschaften, z.B. invertierbar, det(A)/=0, zu einer Dreiecksmatrix ähnlich. Es bedeutet soviel wie, dass das GlS lösbar sein muss. Probier es doch erstmal mit der Einheitsmatrix I=[1,0,0;0,1,0;0,0,1] mit b irgendwas z.B. b=[1;2;3]. Dann muss als Lösung natürlich auch x=[1;2;3] herauskommen. Wenn nicht, dann ist irgendein Fehler im Programm. Du kannst wie im Programm die Methode mit A=input(...) benutzen oder du schreibst erstmal das A fest ins Programm rein.

  3. Samstag 11.06.2011 18:42 von
    Nicole

    Hallo,
    ich habe auch einen Gauss geschrieben und bin bei mir auf Fehlersuche und habe zufällig Ihren gesehen. Ich bin jetzt auch nicht die beste im Programmieren. Deswegen meine Fragen:Ich verstehe nicht was in Zeile 7 und 8 passiert da wird was durgelaufen, aber was? und was is bei Ihnen Zeile und Spalte? Und ich verstehe die Schreife in 14 und 15 nicht, für was ist diese? Und zu letzt die Notation in Zeile 22 was wird dort gemacht? Ixh habe ebenfalls Ihr Programm bei mir mal laufen lassen ich bekomme aber vor der Rückwertssubstitution keine Dreiecksmatrix raus, vltl habe ich was falsch gemacht, es wäre lieb wenn sie mir Ihr Programm an den gesagten Stellen mal erklären könnten vllt hilft mir dies bei meinem programm.

    Freundliche Grüße
    Nicole

  4. Freitag 17.06.2011 00:57 von
    SimonPraetorius

    Ziel des Gauß-Algorithmus ist es die Matrix in Dreiecksgestalt zu bringen. Gehen wir mal davon aus, dass in diesem Prozess alles glatt läuft, dann interessieren uns am Ende (für die Rückwärseinsetzung) nur die Werte, die in der (oberen) Dreiecksmatrix stehen. Um nicht unnötig zusätzlichen Speicher für neue Variablen zu verbrauchen, ist ein Trick irgendwelche Zwischenwerte in der strikten unteren Dreiecksmatrix zu speichern. Deswegen ist auch deine Endmatrix nicht in Dreiecksform, da die unteren Einträge für den Algorithmus mitverwendet werden, aber am Ende nicht von Belang sind. Am besten das Verfahren für eine einfache 3x3-Matrix auf dem Papier durchführen. Dann sieht man was passiert. Es werden unnötige Schritte weggelassen, z.B. das Einträgen einer 0, denn man weiß durch die Subtraktion eines vielfachen z.B. der 1. Zeile von der 2. Zeile wir ein Eintrag zu 0 gemacht und die anderen Einträge entsprechend skaliert, genau wie die rechte Seite.
    Vielleicht als kurze Er

Kommentar hinzufügen

Dieses Feld bitten nicht ausfüllen: