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 Zeileprintf("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
-
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 } }