Rechercher : dans
Par :

Résolution système lineaire par gauss seidel

Dernière réponse le 29 oct 2008 à 20:11:00 barycentre, le 27 avr 2008 à 00:36:45 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « résolution système lineaire par gauss seidel » dans :
Blocage du PC / Ordinateur se bloque / Système gelé (freezes) VoirPour régler ce problème, il faut d’abord connaitre les raisons qui font qu'une machine peut se bloquer. Le terme "freeze" est parfois utilisé pour indiquer que le système est "gelé". Si les solutions ci-dessous ne sont pas suffisantes, une...
Disk boot failure - Insert system disk and press Enter VoirLe message d'erreur «DISK BOOT FAILURE INSERT SYSTEM DISK AND PRESS ENTER», «Disque non système» ou «No system disk» signifie que l'ordinateur n'a pas trouvé de système d'exploitation sur lequel démarrer (booter). Les causes de ce message d'erreur...
[Bootloader] Dual boot : changer le système démarré par défaut VoirPour changer le système démarré par défaut suivant votre "bootloader" il vous faut : (toutes ces manipulations sont à exécuter en tant que "root") Pour LILO Pour GRUB Pour LILO Éditer votre fichier de configuration...
DNS (Système de noms de domaine) VoirQu'appelle-t-on DNS ? Chaque ordinateur directement connecté à internet possède au moins une adresse IP propre. Cependant, les utilisateurs ne veulent pas travailler avec des adresses numériques du genre 194.153.205.26 mais avec un nom de domaine...
Système d'exploitation VoirDescription du système d'exploitation Pour qu'un ordinateur soit capable de faire fonctionner un programme informatique (appelé parfois application ou logiciel), la machine doit être en mesure d'effectuer un certain nombre d'opérations...
Introduction aux systèmes AS/400 VoirIntroduction à l’AS/400 AS/400 est une gamme de mini-ordinateurs IBM apparue début février 1987. Dans l’informatique de gestion d’IBM, il existe trois gammes d’ordinateurs : les gros systèmes (appelés MainFrame), ES/9000, sous le système...

1

dandypunk, le 27 avr 2008 à 00:53:33

System.dat est un fichier system de windows.
PS je n'ai pas lu la suite. Il y a certainement plus simple, mais ça tourne.
SNOC XUA TROM (Vieille devise coloniale)

Répondre à dandypunk

2

barycentre, le 27 avr 2008 à 01:01:13
  • +1

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.

Répondre à barycentre

3

dandypunk, le 27 avr 2008 à 01:11:19

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.
Il y a certainement plus simple, mais ça tourne.
SNOC XUA TROM (Vieille devise coloniale)

Répondre à dandypunk

4

barycentre, le 27 avr 2008 à 01:23:36

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..;

Répondre à barycentre

5

dandypunk, le 27 avr 2008 à 01:29:02
  • +1

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. Il y a certainement plus simple, mais ça tourne.
SNOC XUA TROM (Vieille devise coloniale)

Répondre à dandypunk

6

barycentre, le 27 avr 2008 à 01:39:45

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

Répondre à barycentre

7

dandypunk, le 27 avr 2008 à 01:57:21

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. Il y a certainement plus simple, mais ça tourne.
SNOC XUA TROM (Vieille devise coloniale)

Répondre à dandypunk

8

rahmani, le 17 mai 2008 à 21:51:56

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.

Répondre à rahmani

9

 mouna, le 29 oct 2008 à 20:11:00
  • +2

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.

Répondre à mouna