Résolution système lineaire par gauss seidel

Fermé
barycentre Messages postés 4 Date d'inscription samedi 26 avril 2008 Statut Membre Dernière intervention 27 avril 2008 - 27 avril 2008 à 00:36
 el si mouh - 15 févr. 2012 à 17:54
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

10 réponses

s'il vous plais je veux un programme de résolution du systeme liniaire par la méthode de jacobi et gauss saidel en fotan et merci beaucoup.
6
slt s.v.p je veux un programme MATLAB pour resoudre l"equation Ax=B par la methode de Gauss si le pivot est nulls.........merçi
0
bon soir,je n'ai pas le bagage de programmation en maple et je dois faire cet exercice:
1)programmer la méthode LU(gauss) pour les matrices tridiagonales.
2)Programmer les méthodes de Jacobi et Gauss_Seidel.
5
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83
27 avril 2008 à 01:29
Oui un problème de compatibilité.
La preuve.
System.dat est un des fichier système de windows.
Je me répète , mais on appelle cla de la pédagogie.
Donc les données que tu recevais du fichier system.dat initial sous UNIX venait en fait du fichier system.dat Windows.
Il est d'ailleurs étonnant que tu puisse le lire.
1
%******************************
% Résolution d'un système linéaire *
% par la méthode itérative générale *
%******************************
clear all;
clc;
fprintf('Méthode itérative générale\n');
n=30000;
a=[1 1 1;2 -1 3;3 2 -2];
y=[1 4 -2];
x=zeros(1,3);
w=0.2; % facteur de relaxation : 0<w<1
epsilon=1e-10;
for k=1:n
erreur=0;
for i=1:3
s=0;
xb=x(i);
for j=1:3
if i~=j
s=s+a(i,j)*x(j);
end
end
x(i)=w*(y(i)-s)/a(i,i)+(1-w)*x(i);
erreur=erreur+abs(x(i)-xb);
end
if (erreur/3<epsilon)
fprintf('Itération no. : %d\t Erreur = %7.2e\n',k,erreur);
break;
end
end
x
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83
27 avril 2008 à 00:53
System.dat est un fichier system de windows.
PS je n'ai pas lu la suite.
0
barycentre Messages postés 4 Date d'inscription samedi 26 avril 2008 Statut Membre Dernière intervention 27 avril 2008
27 avril 2008 à 01:01
Merci de m'avoir répondu !

Ca fait quoi que "system.dat" soit un fichier windows? Ca une importance?

Et deuxième ment je sais bien que le programme tourne mais ce que je ne comprends pas c'est pourquoi il donne des résultats faux et un nombre d'itérations constant malgré qu'on fasse varier l'erreur (epsilon)!

Merci d'avance.
0
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83
27 avril 2008 à 01:11
C'est un fichier système. Tout simplement.
En appellant ton fichier syteme.dat. ton programmefonctionne-t-il?
Je suppose que tu a ecrit avec une version UNIX.
0
barycentre Messages postés 4 Date d'inscription samedi 26 avril 2008 Statut Membre Dernière intervention 27 avril 2008
27 avril 2008 à 01:23
En fait on avait travaillé ce programme sur linux o début et là je l'ai retouché sur windows. ca peut générer des problèmes?

Je connais rien en info..;
0
barycentre Messages postés 4 Date d'inscription samedi 26 avril 2008 Statut Membre Dernière intervention 27 avril 2008
27 avril 2008 à 01:39
Tu as bien raison, je viens de le re-teser et il marche pas !!! il affiche une valeur d'erreur (qui n'est pas un nombre) incompréhensible...J'y comprends plus rien, j'arriverais jamais à faire mon devoir..:s
0
dandypunk Messages postés 831 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 11 septembre 2011 83
27 avril 2008 à 01:57
Tu a écrit
int i,j;
FILE *fichier;
char Nom_du_fichier[80]= "system.dat
";

Remplace par CHAR Nom_du_fichier[80]="Syteme.dat"

Pourquoi [80] ???
Bref pour l'instant ce n'est pas important.
0
bonjour..s.v.p je veux un programme MATLAB pour resoudre l'equation Ax=B par la methode de Gauss si le pivot est null...merçi
0