Accueil > > > RÉSOLUTION DE SYSTÈMES D'ÉQUATIONS LINÉAIRES
RÉSOLUTION DE SYSTÈMES D'ÉQUATIONS LINÉAIRES
Information sur la source
Description
permet de résoudre des systèmes d'équations linéaires selon la méthode du pivot maximum. il admet tout type de système, carré ou non. si vous avez plus d'inconnues que d'équations, les inconnues sont exprimées en fonctions des autres de manière à diminuer le nombre d'inconnues. d'abord on rentre la taille du système puis les coefficients, puis les constantes.
Source
- #include <math.h>
- #include <conio.h>
- #include <conio.c>
- #define beep printf("%c",0x07);
- #define precision 0.0001
-
- void clreos(void)
- {int i,x,y;
- clreol();
- x=wherex(); y=wherey();
- for (i=wherey()+1;i<=25;i++)
- {gotoxy(1,i); clreol();}
- gotoxy(x,y) ;
- return;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- void afficher(int n,int p, float A[n][p],float B[n], int imposs)
- {int ref,i,j,i2;
-
- if (n==0) printf("syst%cme vide",138);
- else
- if ((imposs==1) || (n>p)) {textcolor(12); printf("Syst%cme impossible",138); textcolor(7); }
- else if (n==1)
- {
- i=0;
- while ((i<p) && (A[0][i]!=1))
- i++; //i est donc la position d'un "1", il y en a forcément au moins un
- printf("X%d = ",i+1);
- ref=0;
- for (j=0;j<p;j++)
- {if (j==i) continue;
- if (fabs(A[0][j])>precision)
- {if ((A[0][j]<0) && (ref==1)) printf("+");
- if (A[0][j]==1) {printf("-X%d",j+1); ref=1;}
- else if (A[0][j]==-1) {printf("X%d",j+1); ref=1;}
- else {printf("%8.3fX%d",-A[0][j],j+1); ref=1;}
- }
-
- }
- if (fabs(B[0])>precision)
- {if ((ref==1) && (B[0]>0)) printf("+");
- printf("%8.3f",B[0]);
- }
- }
-
- else
- for (i=0;i<n;i++)
- {
- for (j=0;j<p;j++)
- if (A[i][j]==1)
- {i2=0;
- while (i2<n)
- {if (i2==i) {i2++; continue;}
- if (fabs(A[i2][j])<precision)i2++;
- }
- if (i2==n)
- {printf("X%d",j+1); i2=j;}//juste pour ne pas perdre l'indice de la valeur déjà écrite
- }
- printf(" = ");
-
- ref=0; //drapeau
- for (j=0;j<p;j++)
- {if (j==i2) continue; //tous les autres différents de 0 seront écrits
-
- if (fabs(A[i][j])>precision)
- {if ((ref==1) && (A[i][j]<0)) printf("+");
-
- if (A[i][j]==1) {printf("-X%d",j+1); ref=1;}
- else if (A[i][j]==-1) {printf("X%d",j+1); ref=1;}
- else {printf("%8.3fX%d",-A[i][j],j+1); ref=1;}
- }
-
- }
- if (fabs(B[i])>precision)
- {if ((ref==1) && (B[i]>0)) printf("+");
- printf("%8.3f",B[i]);
- }
- printf("\n");
-
- }//fin du for i (pour chaque ligne) et donc fin du else
- return;
- }//fin de la fonction afficher
- ////////////////////////////////////////////////////////////////////////////////////////
-
-
- float saisie (int i, int j)
- {float coef;
- int compteur;
- char * coefstring;
- coefstring=(char*)malloc(sizeof(char));
-
- gotoxy(1,8); clreos();
- printf("entrez le nombre [%d][%d] : ",i+1,j+1);
- gets(coefstring);
- compteur=sscanf(coefstring,"%f",&coef);
-
- while (compteur!=1)
- {beep
- gotoxy(1,8); clreos();
- printf("entrez le nombre [%d][%d] : ",i+1,j+1);
- gets(coefstring);
- //scanf("%s",coefstring);
- compteur=sscanf(coefstring,"%f",&coef);
- }
-
- return coef;
- }
- /////////////////////////////////////////////////////////////////////////////////////////
-
- float saisie2(int i)
- {float coef;
- int compteur;
- char * coefstring;
- coefstring=(char*)malloc(sizeof(char));
-
- gotoxy(1,8); clreos();
- printf("entrez la constante %d : ",i+1);
- gets(coefstring);
- compteur=sscanf(coefstring,"%f",&coef);
-
- while (compteur!=1)
- {beep
- gotoxy(1,8); clreos();
- printf("entrez la constante %d : ",i+1);
- gets(coefstring);
- //scanf("%s",coefstring);
- compteur=sscanf(coefstring,"%f",&coef);
- }
-
- return coef;
- }
- /////////////////////////////////////////////////////////////////////////////////////////
-
- void resoudre(int n,int p)
- { float A[n][p];
- float B[n];
-
- float max,constante;
- int i,i2,j,rang;
- char refaire,impossible;
-
-
-
- for (i=0;i<n;i++)
- for (j=0;j<p;j++)
- A[i][j]=saisie(i,j);
-
- for (i=0;i<n;i++)
- B[i]=saisie2(i);
-
-
-
- gotoxy(1,wherey()-1); clreos();
- printf("Le syst%cme suivant \n",138);;
- for (i=0;i<n;i++)
- {for (j=0;j<p;j++)
- {if ((j>0) && (A[i][j]>=0)) printf("+");
- printf("%8.3f X%d ",A[i][j],j+1);
- }
- printf(" = %8.3f\n",B[i]);
- }
-
- printf("\nest %cquivalent %c\n",130,133);
-
-
- impossible=0;
- for(j=0;(j<n) && (impossible==0);j++)
- {
- refaire=1;
- while (refaire==1)
- {
- /*recherche du max de la jieme ligne*/
- max=A[j][0]; rang=0;
- for(i=1;i<p;i++)
- if (fabs(A[j][i])>fabs(max)) {max=A[j][i];
- rang=i;}
-
- /*verifier que le max n'est pas nul*/
- if (fabs(max)<precision) //car la gestion de nombres à virgules n'est pas efficace au delà d'un certain rang - equivalent à max==0
- if (fabs(B[j])>precision) {impossible=1; refaire=0; } //equivalent à if B[j]!=0
- else if (j<(n-1)) //s'il y a encore une équation après
- {for(i=0;i<p;i++) //une equation est combinaison lineaire des autres, elle est donc inutile
- A[j][i]=A[n-1][i]; //remonter la n-1 ieme équation en jieme position
- B[j]=B[n-1];
- n--; refaire=1;
- }
- else { refaire=0; max=1; //max a une valeur quelconque autre que 0 (pour la division)
- n--;
- }
-
- else refaire=0;
-
- }
-
- /*printf("max = %7.20f\n",max);*/
-
- if (impossible==0)
- { /*division de la jieme equation par max*/
- for (i=0;i<p;i++)
- A[j][i]/=max;
- B[j]/=max;
-
- /*soustractions aux autres equations*/
- for (i=j+1;i<n;i++) /*pour chaque equation d'après*/
- {constante=A[i][rang];
- B[i]-=constante*B[j];
- for (i2=0;i2<p;i2++) /*pour chaque coefficient*/
- A[i][i2]-=constante*A[j][i2];
- }
-
- }/*fin du if*/
-
- }/*fin de la boucle j*/
-
-
-
- if ((impossible==0) && (n!=0))
- {
- /*remonter le systeme*/
- for(j=n-1;j>=0;j--)
- { max=A[j][0]; rang=0;
- for(i=0;i<p;i++)
- if (fabs(A[j][i])>max) {max=A[j][i]; rang=i;}
-
- for(i=0;i<p;i++)
- A[j][i]/=max;
-
- for(i=j-1;i>=0;i--)
- { constante=A[i][rang];
- B[i]-=constante*B[j];
- for(i2=0;i2<p;i2++)
- A[i][i2]-=constante*A[j][i2];
- }
- }
-
- }
-
- afficher(n,p,A,B,impossible);
-
- }//fin de la fonction resoudre
- /////////////////////////////////////////////////////////////////////////////////////
-
-
-
- int main()
- {int n,p,i;
- char * temp;
- temp=(char*)malloc(sizeof(char));
- printf("%c",201);
- for (i=1;i<=78;i++) printf("%c",205);
- printf("%c",187); printf("%c",186);
- printf(" M%cthode du pivot maximum ",130);
- printf("%c",186); printf("%c",200);
- for (i=1;i<=78;i++) printf("%c",205);
- printf("%c\n\n\n",188);
-
-
- gotoxy(1,7);
- clreos();
- printf("Combien d'%cquations : ",130);
- gets(temp);
- i=sscanf(temp,"%d",&n);
- if (n<=0) i=0;
-
- while (i!=1)
- {beep
- gotoxy(1,7);
- clreos();
- printf("Combien d'%cquations : ",130);
- gets(temp);
- //scanf("%d",&n);
- i=sscanf(temp,"%d",&n);
- if (n<=0) i=0;
- }
-
-
- gotoxy(1,8);
- clreos();
- printf("Combien d'inconnues : ");
- gets(temp);
- //scanf("%d",&p);
- i=sscanf(temp,"%d",&p);
- if (p<=0) i=0;
-
- while (i!=1)
- {beep
- gotoxy(1,8);
- clreos();
- printf("Combien d'inconnues : ");
- gets(temp);
- //scanf("%d",&p);
- i=sscanf(temp,"%d",&p);
- if (p<=0) i=0;
- }
-
-
- gotoxy(1,7); clreos();
- printf("R%csolution d'un syst%cme %d x %d\n\n",130,138,n,p);
-
- resoudre(n,p);
-
- printf("\nfini");
- getchar();
- return 0;
- }
#include <math.h>
#include <conio.h>
#include <conio.c>
#define beep printf("%c",0x07);
#define precision 0.0001
void clreos(void)
{int i,x,y;
clreol();
x=wherex(); y=wherey();
for (i=wherey()+1;i<=25;i++)
{gotoxy(1,i); clreol();}
gotoxy(x,y) ;
return;
}
///////////////////////////////////////////////////////////////////////////////////////////
void afficher(int n,int p, float A[n][p],float B[n], int imposs)
{int ref,i,j,i2;
if (n==0) printf("syst%cme vide",138);
else
if ((imposs==1) || (n>p)) {textcolor(12); printf("Syst%cme impossible",138); textcolor(7); }
else if (n==1)
{
i=0;
while ((i<p) && (A[0][i]!=1))
i++; //i est donc la position d'un "1", il y en a forcément au moins un
printf("X%d = ",i+1);
ref=0;
for (j=0;j<p;j++)
{if (j==i) continue;
if (fabs(A[0][j])>precision)
{if ((A[0][j]<0) && (ref==1)) printf("+");
if (A[0][j]==1) {printf("-X%d",j+1); ref=1;}
else if (A[0][j]==-1) {printf("X%d",j+1); ref=1;}
else {printf("%8.3fX%d",-A[0][j],j+1); ref=1;}
}
}
if (fabs(B[0])>precision)
{if ((ref==1) && (B[0]>0)) printf("+");
printf("%8.3f",B[0]);
}
}
else
for (i=0;i<n;i++)
{
for (j=0;j<p;j++)
if (A[i][j]==1)
{i2=0;
while (i2<n)
{if (i2==i) {i2++; continue;}
if (fabs(A[i2][j])<precision)i2++;
}
if (i2==n)
{printf("X%d",j+1); i2=j;}//juste pour ne pas perdre l'indice de la valeur déjà écrite
}
printf(" = ");
ref=0; //drapeau
for (j=0;j<p;j++)
{if (j==i2) continue; //tous les autres différents de 0 seront écrits
if (fabs(A[i][j])>precision)
{if ((ref==1) && (A[i][j]<0)) printf("+");
if (A[i][j]==1) {printf("-X%d",j+1); ref=1;}
else if (A[i][j]==-1) {printf("X%d",j+1); ref=1;}
else {printf("%8.3fX%d",-A[i][j],j+1); ref=1;}
}
}
if (fabs(B[i])>precision)
{if ((ref==1) && (B[i]>0)) printf("+");
printf("%8.3f",B[i]);
}
printf("\n");
}//fin du for i (pour chaque ligne) et donc fin du else
return;
}//fin de la fonction afficher
////////////////////////////////////////////////////////////////////////////////////////
float saisie (int i, int j)
{float coef;
int compteur;
char * coefstring;
coefstring=(char*)malloc(sizeof(char));
gotoxy(1,8); clreos();
printf("entrez le nombre [%d][%d] : ",i+1,j+1);
gets(coefstring);
compteur=sscanf(coefstring,"%f",&coef);
while (compteur!=1)
{beep
gotoxy(1,8); clreos();
printf("entrez le nombre [%d][%d] : ",i+1,j+1);
gets(coefstring);
//scanf("%s",coefstring);
compteur=sscanf(coefstring,"%f",&coef);
}
return coef;
}
/////////////////////////////////////////////////////////////////////////////////////////
float saisie2(int i)
{float coef;
int compteur;
char * coefstring;
coefstring=(char*)malloc(sizeof(char));
gotoxy(1,8); clreos();
printf("entrez la constante %d : ",i+1);
gets(coefstring);
compteur=sscanf(coefstring,"%f",&coef);
while (compteur!=1)
{beep
gotoxy(1,8); clreos();
printf("entrez la constante %d : ",i+1);
gets(coefstring);
//scanf("%s",coefstring);
compteur=sscanf(coefstring,"%f",&coef);
}
return coef;
}
/////////////////////////////////////////////////////////////////////////////////////////
void resoudre(int n,int p)
{ float A[n][p];
float B[n];
float max,constante;
int i,i2,j,rang;
char refaire,impossible;
for (i=0;i<n;i++)
for (j=0;j<p;j++)
A[i][j]=saisie(i,j);
for (i=0;i<n;i++)
B[i]=saisie2(i);
gotoxy(1,wherey()-1); clreos();
printf("Le syst%cme suivant \n",138);;
for (i=0;i<n;i++)
{for (j=0;j<p;j++)
{if ((j>0) && (A[i][j]>=0)) printf("+");
printf("%8.3f X%d ",A[i][j],j+1);
}
printf(" = %8.3f\n",B[i]);
}
printf("\nest %cquivalent %c\n",130,133);
impossible=0;
for(j=0;(j<n) && (impossible==0);j++)
{
refaire=1;
while (refaire==1)
{
/*recherche du max de la jieme ligne*/
max=A[j][0]; rang=0;
for(i=1;i<p;i++)
if (fabs(A[j][i])>fabs(max)) {max=A[j][i];
rang=i;}
/*verifier que le max n'est pas nul*/
if (fabs(max)<precision) //car la gestion de nombres à virgules n'est pas efficace au delà d'un certain rang - equivalent à max==0
if (fabs(B[j])>precision) {impossible=1; refaire=0; } //equivalent à if B[j]!=0
else if (j<(n-1)) //s'il y a encore une équation après
{for(i=0;i<p;i++) //une equation est combinaison lineaire des autres, elle est donc inutile
A[j][i]=A[n-1][i]; //remonter la n-1 ieme équation en jieme position
B[j]=B[n-1];
n--; refaire=1;
}
else { refaire=0; max=1; //max a une valeur quelconque autre que 0 (pour la division)
n--;
}
else refaire=0;
}
/*printf("max = %7.20f\n",max);*/
if (impossible==0)
{ /*division de la jieme equation par max*/
for (i=0;i<p;i++)
A[j][i]/=max;
B[j]/=max;
/*soustractions aux autres equations*/
for (i=j+1;i<n;i++) /*pour chaque equation d'après*/
{constante=A[i][rang];
B[i]-=constante*B[j];
for (i2=0;i2<p;i2++) /*pour chaque coefficient*/
A[i][i2]-=constante*A[j][i2];
}
}/*fin du if*/
}/*fin de la boucle j*/
if ((impossible==0) && (n!=0))
{
/*remonter le systeme*/
for(j=n-1;j>=0;j--)
{ max=A[j][0]; rang=0;
for(i=0;i<p;i++)
if (fabs(A[j][i])>max) {max=A[j][i]; rang=i;}
for(i=0;i<p;i++)
A[j][i]/=max;
for(i=j-1;i>=0;i--)
{ constante=A[i][rang];
B[i]-=constante*B[j];
for(i2=0;i2<p;i2++)
A[i][i2]-=constante*A[j][i2];
}
}
}
afficher(n,p,A,B,impossible);
}//fin de la fonction resoudre
/////////////////////////////////////////////////////////////////////////////////////
int main()
{int n,p,i;
char * temp;
temp=(char*)malloc(sizeof(char));
printf("%c",201);
for (i=1;i<=78;i++) printf("%c",205);
printf("%c",187); printf("%c",186);
printf(" M%cthode du pivot maximum ",130);
printf("%c",186); printf("%c",200);
for (i=1;i<=78;i++) printf("%c",205);
printf("%c\n\n\n",188);
gotoxy(1,7);
clreos();
printf("Combien d'%cquations : ",130);
gets(temp);
i=sscanf(temp,"%d",&n);
if (n<=0) i=0;
while (i!=1)
{beep
gotoxy(1,7);
clreos();
printf("Combien d'%cquations : ",130);
gets(temp);
//scanf("%d",&n);
i=sscanf(temp,"%d",&n);
if (n<=0) i=0;
}
gotoxy(1,8);
clreos();
printf("Combien d'inconnues : ");
gets(temp);
//scanf("%d",&p);
i=sscanf(temp,"%d",&p);
if (p<=0) i=0;
while (i!=1)
{beep
gotoxy(1,8);
clreos();
printf("Combien d'inconnues : ");
gets(temp);
//scanf("%d",&p);
i=sscanf(temp,"%d",&p);
if (p<=0) i=0;
}
gotoxy(1,7); clreos();
printf("R%csolution d'un syst%cme %d x %d\n\n",130,138,n,p);
resoudre(n,p);
printf("\nfini");
getchar();
return 0;
}
Conclusion
inconvénients : non ansi, peu convivial, lectures non sécurisées ; mais si on n'est pas trop benêt, ça marche impeccable !
autre inconvénient : le programme se trompe si vous mettez des coefficients trop proches les uns des autres (de l'orde du dix-millième), mais faut déjà le vouloir !
avantages (bah ouais, il y en a) : résoud tous types de systèmes linéaires, carrés ou non.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|