Resoudre un systeme d'equation lineaire

Fermé
sisimouhamed - 18 juin 2009 à 17:13
othmaneayyadi Messages postés 1 Date d'inscription samedi 17 octobre 2009 Statut Membre Dernière intervention 17 octobre 2009 - 17 oct. 2009 à 11:36
Bonjour,
je voudrais fire un programme en C qui resoud un systeme d'equation lineaire à N equations et N inconnue.
pour cela voici comment doit on proceder:
1.chercher li pivot max à chaque etape.
2.Si le pivot max ne se trouve pas dans le premier ligne donc on doit permuter la ligne où se trouve le pivot max avec la premiere ligne.On continue à le repeter à chaque etape pour rendre le systeme sous forme d'une matrice triangulaire.
3.On resout le systeme.
Mais si le pivot max est <EPSILON ou egale 0 dans ce cas la resolution est impossible.
Voici ce que j'ai fais mais j'arrive pas à avoire un resultat.
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define EPSILON 1e-6
float** allouer(int* nb_ligne , int* nb_col);
void lecture_systeme(void);
int pivotmax(int k);
void permutation(int m , int k);
void reduction(int j , int k , double u);
void Resolution(float*x);
void affichersolution(void);
int main()
{
int k , m;
int nb_ligne , nb_col;
float** tab;

tab=allouer(&nb_ligne , &nb_col);
lecture_systeme();
permutation( m , k);
affichersolution();
free(tab);

getch();
return 0;
}

/*Fonction pour la lecture du systeme d'equation*/
void lecture_systeme(void)
{
int nb_incon;/*Nombre de colonne*/
int nb_eq;/*Nombre de ligne*/
/*Declaration dynamique d'un tableau à 2 dimenssion*/
float **tab;
int i , j;
printf("Combien d'inconnues?");
scanf("%d",&nb_incon);
printf("Combien d'equation?");
scanf("%d",&nb_eq);
tab=allouer(&nb_eq , &nb_incon);
for(i=0 ; i<nb_eq ; i++)
{
printf("Entrez les coefficients de la %deme equation:\n",i+1);
for(j=0 ; j<=nb_incon ; j++)
{
scanf("%f",&tab[i][j]);
}
}

}
int pivotmax(int k)
{
int pivot;
float **tab;
int nb_ligne , nb_col;
int i , m ;
tab=allouer(&nb_ligne , &nb_col);

for(k=0 ; k<nb_col-1 ; k++)
{
m=k;
pivot=fabs(tab[m][k]);
for(i=k+1 ; i<nb_col ; i++)
{
if(fabs(tab[i][k])>pivot)
{
m=i;
pivot=fabs(tab[m][k]);
}

}
if(pivot<=EPSILON || pivot==0)
{
printf("Resolution impossible!!!\n");
exit(1);
}

}
free(tab);

return m;
}
void permutation(int m , int k)
{
float** tab;
float sol;
int temp;
int nb_ligne , nb_col;
float *x=(float*)malloc(nb_ligne*sizeof(float));
tab=allouer(&nb_ligne , &nb_col);
int j;
int a ;
double u_fw;
for(k=0 ; k<nb_col ;k++)
{
m=k+1;
m=pivotmax(k);
for(j=k ; j<=nb_col ; j++)
{
temp=tab[m][j];
tab[m][j]=tab[k][j];
tab[k][j]=temp;

}
reduction(a ,k ,u_fw);
}
Resolution( x);
free(x);
}
void reduction(int j , int k , double u)
{
int m;
int i;
int nb_ligne , nb_col;
float **tab;
tab=allouer(&nb_ligne ,&nb_col);

m=k;
u=fabs(tab[m][k]);
for(i=k+1 ; i<nb_ligne-1 ; i++)
{
u=tab[i][k]/tab[k][k];
for(j=k ; j<=nb_col-1 ; j++)
{
tab[i][j]=tab[i][j]-u*tab[k][j];
}
}

}
void Resolution(float* x)
{
int i , j;
float** tab;
float piv;
int nb_eq , nb_incon;
tab=allouer(&nb_eq , &nb_incon);
x=(float*)malloc(nb_eq*sizeof(float));
for (i =nb_incon-1; i >= 0; i--)
{
piv= 0;
for (j = i + 1; j < nb_eq; j++)
{
piv= piv + tab[i][j] * x[j];
}
x[i] = (tab[i][nb_incon] - piv) / tab[i][i];
}
free(tab);
free(x);
}
void affichersolution(void)
{
int i;
int nb_incon;
float*x=(float*)malloc(nb_incon*sizeof(float));
printf("Solution:\n");
for (i = 0; i < nb_incon; i++)
printf("x[%d] : %f\n", i+1, x[i]);
}
float** allouer(int *nb_ligne , int* nb_col)
{
float **tab;
int i , j;
tab=malloc(*nb_ligne*sizeof(float*));
if(tab==NULL)
{
printf("\nEchec l'or de l'allocation memoire!!!");
exit(1);
}
for(i=0 ; i<*nb_ligne ; i++)
{
tab[i]=malloc(*nb_col*sizeof(float));
}
return tab;
}

Merci de m'aider je compte sur vous.

3 réponses

Utilisateur anonyme
18 juin 2009 à 17:15
1)li pivot ? What ???

2) Tu veux pas quand même que l'on fasse tout à ta place ?
1
othmaneayyadi Messages postés 1 Date d'inscription samedi 17 octobre 2009 Statut Membre Dernière intervention 17 octobre 2009 1
17 oct. 2009 à 11:36
Compile ligne par ligne.
1
sisimouhamed
18 juin 2009 à 17:24
Je veux juste une corection car je s'ais que j'ai trouvé toutes les fonction mais le probleme en est que j'arrive pas à les bien appeller.Car si je compile je vois pas les resultats
0