Résolution système lineaire par gauss seidel
barycentre
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
el si mouh -
el si mouh -
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
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
A voir également:
- Résolution système lineaire par gauss seidel
- Restauration systeme windows 10 - Guide
- Vérificateur des fichiers système - Guide
- Vous avez besoin d'une autorisation de la part de système pour modifier ce dossier - Guide
- Réduire résolution image - Guide
- Cloner disque systeme - Guide
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.
nana
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
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.
1)programmer la méthode LU(gauss) pour les matrices tridiagonales.
2)Programmer les méthodes de Jacobi et Gauss_Seidel.
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.
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.
%******************************
% 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
% 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
System.dat est un fichier system de windows.
PS je n'ai pas lu la suite.
PS je n'ai pas lu la suite.
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.
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.
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.
En appellant ton fichier syteme.dat. ton programmefonctionne-t-il?
Je suppose que tu a ecrit avec une version UNIX.
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..;
Je connais rien en info..;
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