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.


Anmelden zum Antworten