PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gauss Algorithmus



helvin
05-03-2006, 17:34
Meine Aufgabe ist das ich eine funktion schreibe die es erlaubt n lineare Gleichungen mit n unbekannten zu lösen A*x = b.
Eingabe ist eine Matrix A und der Vektor b, und ausgegebn soll der Vektor x.

Hat jemand eine gute Ide wie man das lösen kann.

Danke in Voraus

Caveman
05-03-2006, 21:00
Für die Matrix würde ich vorschlagen, dass Du einen Vector (Java, C++) her nimmst, der pro Zeile weitere Vectoren enthält. Darin muss dann auch b enthalten sein, so dass Du eine Matrix mit n+1 = m Elementen hast.
Dann kannst Du die Zeilen nach und nach von 1 bis m mit dem Gauss Algorithmus berechnen und danach in umgekehrter Richtung die Unbekannten berechnen.
Vorher kann man vielleicht noch abfangen, ob es sich um ein inhomogenes oder homogenes lineares Gleichungssystem handelt.

Welche Programmiersprache willst Du verwenden?

helvin
06-03-2006, 11:55
Ich verwende PellesC für die schule
Kann man irgendwo einen fertigen kode anseheh oder herunterladen

Caveman
06-03-2006, 13:00
Ich kenne PellesC überhaupt nicht. Kann man damit auch C++ programmieren?

Einen fertigen Code hab ich nicht gefunden, aber unter
http://de.wikipedia.org/wiki/Gau%C3%9Fsches_Eliminationsverfahren
ist ein Verweis auf
http://people.freenet.de/julianvarghese//inf-facharbeit/Gauss.html
wo man sehen kann wie es als Java-Applet funktionieren kann.

helvin
06-03-2006, 18:07
ja man kann damit c++ programieren, und er hat max. 10 MB

Caveman
06-03-2006, 19:23
Gut, dann kannst Du also Vector benutzen.
Die Funktionen hierzu sind ganz gut hier beschriben:
http://www.cppreference.com/cppvector/index.html

Hier mal kurz ein Beispiel für das Befüllen mit zwei Gleichungen.


#include <vector>
vector<double> matrix;
vector<double> tmp;

tmp.push_back(1);
tmp.push_back(2);
tmp.push_back(2);

matrix.push_back(tmp);

tmp.clear();
tmp.push_back(3);
tmp.push_back(4);
tmp.push_back(1);

matrix.push_back(tmp);

Ob es so wirklich funktioniert, kann ich nicht genau sagen. Es könnte sein, dass mit der Zeile "matrix.push_back(tmp);" nur eine Referenz und keine Kopie erstellt wird, was dann beim erneuten Befüllen von tmp auch die Elemente in matrix ändert.

Zugreifen kannst Du dann auf die Elemente in der folgenden Weise:


tmp = matrix.at(1);
tmp.at(1);

Gleiches Problem wie oben, ich weiß nicht sicher, ob hier jedes Mal eine harte Kopie erzeugt wird.

BinEinGast
06-03-2006, 21:13
Meine Aufgabe ist das ich eine funktion schreibe die es erlaubt n lineare Gleichungen mit n unbekannten zu lösen A*x = b.
Eingabe ist eine Matrix A und der Vektor b, und ausgegebn soll der Vektor x.

Hat jemand eine gute Ide wie man das lösen kann.

Danke in Voraus

hm, mal weg vom kleinen gauss. warum berechnest du die lösung des gleichungssystems nicht einfach über determinanten? ich habe mich jetzt noch nicht weiter mit der implementierung auseinandergesetzt, aber das müßte rekursiv eigentlich richtig elegant lösbar sein

peschmae
07-03-2006, 08:43
Der Punkt ist wohl dass das Determinantenzeugs viel aufwändiger ist vom Rechenaufwand her. O(n!) oder so was grausames afair. Bei Gauss bleibst du mit O(n^3) ganz bescheiden im Vergleich.

MfG Peschmä

helvin
07-03-2006, 18:43
wie kann man das ueber die Determinanten Loesen?

bischi
07-03-2006, 18:59
Rekursiv - aber solange du nicht weisst, wie ne Determinante berechnen - ist der Gauss-Algo wohl leichter zu implementieren.

Aufwand mit Determinanten dürfte wohl wirklich O(n!) sein.

Mit Gauss die erwähnten O(n^3)

Zum Vergleich: Nimmst du eine 10 mal 10 Matrix und rechnest die mit Gauss aus. Nehmen wir an, du hast damit 1 Sekunde lang zu tun. Mittels Determinanten hast du schon eine Stunde lang zu rechnen!

MfG Bischi

helvin
07-03-2006, 19:23
ich habe einen Code fuer den Gauss gefunden an folgender Seite (4-5 Seite) :
http://people.fh-landshut.de/%7Ehmn/mfi/auflage3/loesungen3_8.pdf

aber ich habe den :
#include <iostream>
Code nicht an meinem Computer, weiss jemand wo ich den Code finden kann ?

peschmae
07-03-2006, 20:07
iostream ist C++. Also mit g++ kompilieren (und falls du das noch nicht hast die passende libstdc++xyz-dev installieren)

MfG Peschmä

helvin
08-03-2006, 08:53
wo kann ich den code #include <iostream>
finden, ich programiere jetzt in windows und zwar mit den PellesC programm, und ich konnte ihm nicht finden auf meinem Computer und in Internet auch nicht.

peschmae
08-03-2006, 09:11
Das bringt dir nichts - "den code". Wenn du C++ verwendest ist das auch dabei. Und sonst nicht.

Ich weiss ja nicht was PellesC ist - da musst du halt wohl die entsprechenden Aufrufe im Code die C++-Standard Library Sachen verwenden würden durch anderes Zeugs ersetzen.

MfG Peschmä

oscarspatz
17-03-2006, 13:01
Wenn du ne Matrix A x b = C hast und du suchst b - dann erstell dir die Inverse der Matrix A und berechne b= A^(-1) x C
dann biste fertig und brauchst den Gaus nicht :)

vielleicht hilft dir das ja....

peschmae
17-03-2006, 14:20
Ah und wie erstellst du die Inverse? (Doch nicht etwa mit Gauss? :D)

MfG Peschmä

BlueJay
19-03-2006, 14:38
... dann erstell dir die Inverse der Matrix A und berechne b= A^(-1) x C
dann biste fertig und brauchst den Gaus nicht :)


und wie invertierst du die Matraze? :D

Eine gute Einführung in die Gauss-Methode findest du im

Lehr- und Übungsbuch Mathematik, Band IV
Verlag Harri Deutsch Thun und Frankfurt/Main
ISBN 3 87144 277 1


SCNR,
uja

unaimed
22-03-2006, 07:50
Programmbeispiele für das Punkt-Gauss-Seidel-Verfahren (PGS) gibt es doch viele....
Für größere Matrizen würde ich dir das GMRES-Verfahren empfehlen.