Resoudre un systeme d'equation lineaire
sisimouhamed
-
othmaneayyadi Messages postés 1 Statut Membre -
othmaneayyadi Messages postés 1 Statut Membre -
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.
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.
A voir également:
- Resoudre un systeme d'equation lineaire
- Restauration systeme windows 10 - Guide
- Vérificateur des fichiers système - Guide
- Comment refaire le système d'un ordinateur - Guide
- Vous avez besoin d'une autorisation de la part de système pour modifier ce dossier - Guide
- Editeur d'équation - Télécharger - Vie quotidienne