Bonjour,
J'ai un devoir d'informatique à faire. je dois notamment résoudre un système lineaire (A.x=b) par l'algorithme de gauss seidel. Par un fichier system.dat, on lui donne les valeurs des coefficients de la matrice ainsi que les composantes du vecteur b. Le programme donne des résultats faux;; Je sais pas d'où peut venir le problème. Voici le programme:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define Limit 100 /* Limit sera remplace par 100
partout dans le programme */
extern int n;
extern double A[Limit][Limit], b[Limit], x[Limit];
/* Interface pour les fonctions appelees */
void read_system ( void );
int gauss_seidel( double epsilon );
void write_solution( void );
void normalisation(void);
/* Programme principal */
int
main (void)
{
int k, iterations;
double epsilon;
/********************************************/
/* Saisit les parametres */
/********************************************/
printf ("Entrer la precision: ");
scanf ("%lf",&epsilon);
/********************************************/
/* Lecture des donnees */
/********************************************/
read_system();
/********************************************/
/* Normalisation des matrices */
/********************************************/
normalisation();
/********************************************/
/* Resolution du systeme */
/********************************************/
for(k=0;k<n;k++)
{
x[k]=0;
}
iterations = gauss_seidel(epsilon);
/********************************************/
/* Ecriture des resultats */
/********************************************/
printf ("Le systeme est resolu apres %d iterations.\n ",iterations);
write_solution();
system("PAUSE");
return 0;
}
/***********************************************************/
/* Fonctions */
/***********************************************************/
void
read_system( void )
{
int i,j;
FILE *fichier;
char Nom_du_fichier[80]= "system.dat";
fichier = fopen(Nom_du_fichier, "r");
if (fichier == NULL)
{
printf ("Le fichier %s n'a pas pu etre ouvert\n", Nom_du_fichier);
return;
}
/* lit les donnees */
fscanf (fichier, "%d", &n );
for ( i=0; i<n; i++)
{
for ( j=0; j<n; j++)
{
fscanf (fichier, "%lf", &A[i][j]);
}
}
for ( i=0; i<n; i++)
{
fscanf (fichier, "%lf", &b[i]);
}
fclose (fichier);
return;
}
void
write_solution( void )
{
int j;
FILE *fichier;
char Nom_du_fichier[80]= "solution.dat";
fichier = fopen(Nom_du_fichier, "w");
if (fichier == NULL)
{
printf ("Le fichier %s n'a pas pu etre ouvert\n", Nom_du_fichier);
return;
}
/* ecrit les donnees */
for ( j=0; j<n; j++)
{
fprintf (fichier, "%d %15.8e \n", j, x[j]);
}
fclose (fichier);
return;
}
void
normalisation()
{
int i,j,k;
double tA[Limit][Limit];
double A_copie[Limit][Limit], b_copie[Limit];
// tA = transposee de A
for (i=0; i<n; i++)
for (j=0; j<n; j++)
tA[j][i] = A[i][j];
// A_copie = tA * A
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
A_copie[i][j]=0;
for (k=0; k<n; k++)
A_copie[i][j] += tA[i][k] * A[k][j];
}
// b_copie = tA * b
for (i=0; i<n; i++)
{
b_copie[i] = 0;
for (j=0; j<n; j++)
b_copie[i] += tA[i][j] * b[j];
}
// A = A_copie
for (i=0; i<n; i++)
for (j=0; j<n; j++)
A[j][i] = A_copie[i][j];
// b = b_copie
for (i=0; i<n; i++)
b[i] = b_copie[i];
}
int
gauss_seidel(double epsilon)
{
int iter=0;
int j, k;
double X, Y;
double x2[Limit];
double som1, som2;
double cond;
do
{
iter++;
for(j=0;j<=n-1;j++)
{
x2[j]=x[j]; Le problème vient-il peut être de là?
}
for (k=0; k<=n-1; k++)
{
Y=0;
for(j=1;j<=k-1;j++)
{
Y=Y+A[k][j]*x2[j];
}
X=0;
for(j=k+1;j<=n;j++)
{
X=X+A[k][j]*x[j];
}
x[k]= (1/A[k][k])*(b[k]-Y-X);
}
som1=0;
som2=0;
for(j=0;j<n;j++)
{
som1=som1+(x[j]-x2[j])*(x[j]-x2[j]);
som2=som2+abs(x[j]*x[j]);
}
cond = som1/som2;
printf("Iteration %d : erreur = %f\n", iter, cond);
} while(cond > (epsilon*epsilon));
return iter;
}
Merci d'avance.
Cordialement
Barycentre
Configuration: Windows XP
Firefox 2.0.0.4