Gauß-Algorithmus --- Problem beim Rückwärtseinsetzen



  • Hallo C - Community,

    ich habe ein Problem mit dem von mir erstellten Programm zum Berechnen einer n x n – Matrix mit Hilfe des Gauß'schen Eliminationsverfahren und hoffe, dass ihr mir weiterhelfen könnt. Die Aufgabenstellung lautete einen Algorithmus ohne Pivotisierung zu programmieren.

    Das von mir geschriebene Programm erstellt ohne weiteres eine Matrix, gibt diese Matrix zur Fehlerkontrolle auch aus, die Matrix wird richtig normiert und auch die Vorwärtselimination funktionert problemlos, aber kurz nachdem die Schleife für das Rückwärtseinsetzen startet, bricht das Programm ab.

    Zu meiner Schande muss ich gestehen, dass bis vor wenigen Wochen nichts mit C ab Hut hatte. Deswegen stehe ich jetzt etwas auf dem Schlauch. Zwar konnte ich bereits einen funktionierenden Algorithmus schreiben, allerdings spuckt dieser falsche Ergebnisse aus, weil ich die Koeffizientenmatrix falsch normiert habe. Das Problem mit der Normierung konnte ich lösen, aber jetzt komme ich nicht mehr weiter.

    Hier entsprechende Teil für das Rückwärtseinsetzen:

    void Werte_einsetzen (double a[][NMAX+1], double x[], int n)
    {
    int i, j; // Zeile, Spalte
    int k; // Eliminationsstufe
    double f; // Multiplikationsfaktor

    // Anhand der TestMatrix mit n=3

    // 3 Schleifen:
    // 1. Berechnet den Faktor (a[i][i] / x[i]
    // 2. Multipliziert die Felder über a[i][i] mit f
    // 3. Addiert den neuen Wert des Feldes zum Ergebnisvektor x der Zeile

    printf("Beginne dem Einsetzen der Werte\n\n");

    for(i = n-1; i <= n; --i)
    { // Ergebnis der letzten Zeile
    f = a[i][i] / x[i];//
    }
    // restliche Spalten
    for (j = n-1; j >= 1; --j) // beginnt mit der letzten Spalte
    { for(k = i-1; k >= 0; --k)

    a[j][k] = a[j][k] * f; // berechnet den neuen Wert des Arrays

    x[i] = x[i] – a[j][k]; // zieht den neuen Wert vom Ergebnisvektor ab
    } // dadurch entsteht in dem Array ein Feld
    // mit dem Wert Null.

    x[i]= x[i] / a[i][i]; // Berechnung der Lösung

    }

    }

    Vielleicht könnt ihr mir ja helfen.

    Gruß,
    Dutzwutz


  • Mod

    for(i = n-1; i <= n; --i)
    Wann bricht das wohl ab?



  • void Werte_einsetzen (double a[][NMAX+1], double x[], int n)
    {
      int i, j; // Zeile, Spalte
      int k; // Eliminationsstufe
      double f; // Multiplikationsfaktor
    
    // Anhand der TestMatrix mit n=3
    
    // 3 Schleifen:
    // 1. Berechnet den Faktor (a[i][i] / x[i]
    // 2. Multipliziert die Felder über a[i][i] mit f
    // 3. Addiert den neuen Wert des Feldes zum Ergebnisvektor x der Zeile
    
      printf("Beginne dem Einsetzen der Werte\n\n");
    
      for(i = n-1; i <= n; --i)  //  :warning:  Endlosschleife (zumindest bis i einen Unterlauf hat)
      { // Ergebnis der letzten Zeile
        f = a[i][i] / x[i];//
      }
    // restliche Spalten
      for (j = n-1; j >= 1; --j) // beginnt mit der letzten Spalte
      { for(k = i-1; k >= 0; --k) //  :warning: welches i ist denn gemeint?
        {  //  :warning: fehlt hier eine Klammer ?
          a[j][k] = a[j][k] * f; // berechnet den neuen Wert des Arrays
    
          x[i] = x[i] – a[j][k]; // zieht den neuen Wert vom Ergebnisvektor ab
        } // dadurch entsteht in dem Array ein Feld
          // mit dem Wert Null.
    
        x[i]= x[i] / a[i][i]; // Berechnung der Lösung
      }
    }
    

Anmelden zum Antworten