Nadesłany przez Tomasz Lubiński, 13 marca 2006 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
gs.c:
// Metoda Gaussa-Seidela // www.algorytm.org // (c) 2006 Tomasz Lubinski #include "stdio.h" float A[100][100]; float L[100][100]; float D[100][100]; float U[100][100]; float b[100]; float x[100]; int n, iter; int i, j, k; void main() { // Get n printf("Metoda Gaussa-Seidela\n"); printf("Rozwiazywanie ukladu n-rownan z n-niewiadomymi Ax=b\n"); printf("Podaj n\n"); scanf("%d", &n); if ((n < 1) && (n > 100)) { printf("Nieprawidlowa warosc parametru n\n"); return; } // Get values of A for (i=0; i<n; i++) for (j=0; j<n; j++) { printf("A[%d][%d] = ", (i+1), (j+1)); scanf("%f", &A[i][j]); if ((i == j) && (A[i][j] == 0)) { printf("Wartosci na przekatnej musza byc rozne od 0\n"); return; } } // Get values of b for (i=0; i<n; i++) { printf("b[%d] = ", (i+1)); scanf("%f", &b[i]); } // Divide A into L + D + U for (i=0; i<n; i++) for (j=0; j<n; j++) { if (i < j) { U[i][j] = A[i][j]; } else if (i > j) { L[i][j] = A[i][j]; } else { D[i][j] = A[i][j]; } } // Calculate D^-1 for (i=0; i<n; i++) D[i][i] = 1/D[i][i]; // Calculate D^-1 * b for (i=0; i<n; i++) b[i] *= D[i][i]; //Calculate D^-1 * L for (i=0; i<n; i++) for (j=0; j<i; j++) L[i][j] *= D[i][i]; //Calculate D^-1 * U for (i=0; i<n; i++) for (j=i+1; j<n; j++) U[i][j] *= D[i][i]; //Initialize x for (i=0; i<n; i++) x[i] = 0; printf("Ile iteracji algorytmu wykonac?\n"); scanf("%d", &iter); for (k=0; k<iter; k++) for (i=0; i<n; i++) { x[i] = b[i]; // x = D^-1*b - for (j=0; j<i; j++) x[i] -= L[i][j]*x[j]; // D^-1*L * x - for (j=i+1; j<n; j++) x[i] -= U[i][j]*x[j]; // D^-1*U * x } printf("Wynik\n"); for (i=0; i<n; i++) printf("x[%d] = %f\n", (i+1), x[i]); return; }