Lineares Gleichungssystem
-
Hallo,
ich braechte einen C++ Code zum loesen von linearen Gleichungssystemen.
Ich hab das zwar im Studium gemacht, aber mein Wissen scheint wie erloschen.
Bevor ich da jetzt tagelang rumprogrammiere, waere es gut wenn es schon ein fertiges STueck Code irgendwo im Netz gaebe. Kennt da jemand eine Seite ?
-
Ernsthaft? Lineare Gleichugnssysteme?
-
ja wieso ? Dachte auch nicht dass ich das jemals wieder brauche, aber muss da gerade was programmieren und dazu brauch ich es.
-
Ich stell mir das so vor, ich uebergebe der Funktion eine Koeffizientenmatrix und den Ergebnisvektor und sie spuckt mir die Loesung aus
-
LAPACK
-
Mich wunderts dass ich hier im Netz keinen Code dafür finde. Selbst ich habe den Algorithmus früher schon mal programmiert. Aber das war in C#. da muss es doch irgendwas im Netz geben. Wenn ich das jetzt selber mache , dann dauert es ewig.
-
// Gauss'sches Eliminationsverfahren mit Zeilenpivotisierung // Argumente: // double a[N][N+1] erweiterte Koeffizientenmatrix Read/Write // int n Anzahl der Gleichungen Read // double x[N] Loesungen Write // Resultat: // int Fehlercode 0 fuer Fehler, 1 fuer Erfolg int Gaussalg (double a[][NMAX], int n, double x[]) { int i, j; // Zeile, Spalte int s; // Elimininationsschritt int pzeile; // Pivotzeile int fehler = 0; // Fehlerflag double f; // Multiplikationsfaktor const double Epsilon = 0.01; // Genauigkeit double Maximum; // Zeilenpivotisierung extern FILE *fout; s = 0; do { // die einzelnen Eliminationsschritte fprintf(fout, "Schritt %2i von %2i\n", s+1, n-1); Maximum = fabs(a[s][s]); // groesstes Element pzeile = s ; // suchen for (i = s+1; i < n; i++) if (fabs(a[i][s]) > Maximum) { Maximum = fabs(a[i][s]) ; pzeile = i; } fehler = (Maximum < Epsilon); if (fehler) break; // nicht loesbar if (pzeile != s) // falls erforderlich, Zeilen tauschen { double h; for (j = s ; j <= n; j++) { h = a[s][j]; a[s][j] = a[pzeile][j]; a[pzeile][j]= h; } } // Elimination --> Nullen in Spalte s ab Zeile s+1 for (i = s + 1; i < n; i++ ) { f = -(a[i][s]/a[s][s]); // Multiplikationsfaktor a[i][s] = 0.0; for (j = s+1; j <= n ; j++) // die einzelnen Spalten a[i][j] += f*a[s][j]; // Addition der Zeilen i, s } #if DEBUG MatOut (stdout, a, n, n+1); #endif s++; } while ( s < n-1 ) ; if (fehler) { fprintf (fout, "gauss: Gleichungssystem nicht loesbar\n"); return 0; } else { // Berechnen der Loesungen aus der entstandenen Dreiecksmatrix // letzte Zeile x[n-1] = a[n-1][n] / a[n-1][n-1]; // restliche Zeilen for (i = n-2 ; i >= 0; i-- ) { for (j = n-1 ; j > i ; j-- ) { a[i][n] -= x[j]*a[i][j]; // rechte Seite berechnen } x[i] = a[i][n] / a[i][i]; // Loesung } return 1; } }
-
Was haltet ihr von dem hier.
-
Und jetzt mach den nochmal in schön. Halte die Variablen lokaler, nutze standard-Algorithmen (z.B. swap, min) und Container statt pointer. Außerdem gehört Ausgabe in Datei und Berechnung in getrennte Funktionen.
-
Marthog schrieb:
Halte die Variablen globaler
Du meinst lokaler
Marthog schrieb:
Und jetzt mach den nochmal in schön.
Das ist nicht sein Code
http://www.zeiner.at/informatik/c/Matrix.html
-
hustbaer schrieb:
Du meinst lokaler
Ui. Das ist mir jetzt peinlich. Ich habe es mal editiert, nicht das noch jemand dadurch auf komische Gedanken kommt.