Ocena użytkownikóww: ***** / 30
Nadesłany przez Tomasz Lubiński, 08 sierpnia 2005 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.
jacobi.c:
// Metoda Jacobiego
// www.algorytm.org
// (c) 2006 Tomasz Lubinski
#include "stdio.h"
float A[100][100];
float M[100][100];
float N[100];
float b[100];
float x1[100];
float x2[100];
int num, iter;
int i, j, k;
//only to avoid the following error:
//scanf: floating point formats not linked
static void forcefloat(float *p)
{
float f = *p;
forcefloat(&f);
}
void main()
{
// Get n
printf("Metoda Jacobiego\n");
printf("Rozwiazywanie ukladu n-rownan z n-niewiadomymi Ax=b\n");
printf("Podaj n\n");
scanf("%d", &num);
if ((num < 1) && (num > 100)) {
printf("Nieprawidlowa warosc parametru n\n");
return;
}
// Get values of A
for (i=0; i<num; i++)
for (j=0; j<num; 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<num; i++) {
printf("b[%d] = ", (i+1));
scanf("%f", &b[i]);
}
// Calculate N = D^-1
for (i=0; i<num; i++)
N[i] = 1/A[i][i];
// Calculate M = -D^-1 (L + U)
for (i=0; i<num; i++)
for (j=0; j<num; j++)
if (i == j)
M[i][j] = 0;
else
M[i][j] = - (A[i][j] * N[i]);
//Initialize x
for (i=0; i<num; i++)
x1[i] = 0;
printf("Ile iteracji algorytmu wykonac?\n");
scanf("%d", &iter);
for (k=0; k<iter; k++) {
for (i=0; i<num; i++) {
x2[i] = N[i]*b[i];
for (j=0; j<num; j++)
x2[i] += M[i][j]*x1[j];
}
for (i=0; i<num; i++)
x1[i] = x2[i];
}
printf("Wynik\n");
for (i=0; i<num; i++)
printf("x[%d] = %f\n", (i+1), x1[i]);
return;
}
jest:
x2 += M[j]*x1[j];
powinno być:
x2 += M[j]*x1[j];
Pozdrawiam
Małe przeliterowanie .