• Aucun résultat trouvé

respectivement :// pour i, un n° de ligne et pour j, un n° de colonne dans le tableau Tab NOTE : dans les "for" ou les "while" les variables locales i et j désigneront 16/01/071

N/A
N/A
Protected

Academic year: 2022

Partager "respectivement :// pour i, un n° de ligne et pour j, un n° de colonne dans le tableau Tab NOTE : dans les "for" ou les "while" les variables locales i et j désigneront 16/01/071"

Copied!
7
0
0

Texte intégral

(1)

#include <iostream>

#pragma hdrstop

#pragma argsused using namespace std;

//--- VARIABLES GLOBALES --- float Tab[30][30]; //tableau du système d'équations

int p; //nombre d'équations int n; //nombre d'inconnues

int LigPiv; //n° de la ligne où le futur pivot est cherché int ColPiv; //n° de colonne où le futur pivot est cherché int NbPivots; //nombre de pivots trouvés

int NumLigne; //n° de la ligne où on a trouvé le pivot en colonne ColPiv //---fin VARIABLES --- //---FONCTIONS --- void SaisieSysteme();

//affiche le message de début du prog

//et permet la saisie des équations par l'utilisateur void Operations();

// effectue les opérations sur les lignes

// pour le pivot situé en ligne LigPiv et en colonne ColPiv // que l'on a remis à sa place par un échange de lignes

// si on l'a trouvé en-dessous de la ligne LigPiv dans la colonne ColPiv void Echange(int x int y);

//pour échanger les lignes x et y void AfficherTableauOperations();

//affiche le tableau du système et

//les opérations à faire sur chaque ligne pour le pivot trouvé void Gauss_Jordan();

//effectue la recherche des pivots successifs

void AfficherTableau();//affiche le tableau "nu" du système sans //opérations à faire

void AfficherSolutions();

//donne les solutions s'il y en a

//---fin FONCTIONS --- //***** DÉBUT DU MAIN (PGM PRINCIPAL) *************************************

int main(int argc, char* argv[]) {

SaisieSysteme Gauss_Jordan();

AfficherTableau();

AfficherSolutions();

cin.sync();

cin.get();

return 0;

}//***** FIN MAIN *********************************************************

//----Détail des FONCTIONS --- //

NOTE : dans les "for" ou les "while" les variables locales i et j désigneront

//

respectivement :

// pour i, un n° de ligne et pour j, un n° de colonne dans le tableau Tab

(2)

//--- Début SaisieSysteme --- void SaisieSysteme()

{

cout<<"Ce programme resout des systèmes linéaires"<<endl;

cout<<" de p équations à n inconnues"<<endl;

cout<<" par la methode du pivot de GAUSS-JORDAN"<<endl;

cout<<" Nombre d'equations ? ";

cin>>p; //n nombre d'équations cout<<endl;

cout<<" Nombre d'inconnues ? ";

cin>>n; //p nombre d'inconnues cout<<endl;

for (int i=1;i<=p;i++) //remplissage du tableau {

cout<<"Equation n° "<<i<<" : "<<endl;

for (int j=1;j<=n;j++) {

cout <<" Coefficient de X"<<j<<" : ";

cin>>Tab[i][j];

}

cout<<" Second membre : ";

cin>>Tab[i][n+1];

cout<<endl;

}

}//--- Fin SaisieSysteme --- //--- Début Operations --- void Operations()

{ // division de la ligne LigPiv du pivot

//(qui est en colonne ColPiv) par le pivot Tab[LigPiv][ColPiv]

for (int j=n+1;j>=ColPiv;j--) {

Tab[LigPiv][j] /= Tab[LigPiv][ColPiv];

}

// pour les autres lignes for (int i=1;i<=p;i++)

{

if (i!=LigPiv) {

for (int j=n+1;j>=ColPiv;j--)

Tab[i][j] -= Tab[i][ColPiv]*Tab[LigPiv][j];

} }

NbPivots++; //on compte le nombre de pivots

Tab[LigPiv][0]=ColPiv; // on mémorise que le pivot de la ligne LigPiv // est en comonne ColPiv

}//--- Fin Operations --- //---Début d'échange des lignes x et y --- void Echange(int x int y);

//échange des lignes x et y à partir de la colonne ColPiv //l'échange n'étant pas nécessaire avant la colonne ColPiv //car on n'échangerait que des 0

{ float Temp;

for (int j=ColPiv;j<=n+1;j++) {

Temp = Tab[x][j];

Tab[x][j] = Tab[y][j];

Tab[y][j] = Temp;

(3)

}//--- Fin d'échange des lignes x et y --- //-début d'affichage du tableau et des opérations effectuer sur les lignes- void AfficherTableauOperations()

{

for (int i=1;i<=p;i++) {

for (int j=1;j<=n;j++) {

cout<<setw(10)<<setprecision(4)<<fixed<<Tab[i][j];

}

cout<<setw(10)<<setprecision(4)<<fixed<<"| "<<Tab[i][n+1];

if (i==NumLigne) {

cout<<"L"<<i<<"/";

cout<<setw(10<<setprecision(4)<<fixed<<Tab[NumLigne][ColPiv];

if (NumLigne != LigPiv) {

cout<<" <--> L"<<LigPiv;

//affichage de l'échange des lignes NumLigne et LigPiv //lorsque le pivot (colonne ColPiv) a été trouve

//dans la ligne NumLigne

>

LigPiv }

} else {

cout<<" L"<<i<<" - (";

cout<<setw(10)<<setprecision(4)<<fixed<<Tab[i][ColPiv];

cout<<")/("setprecision(4)<<fixed<<Tab[NumLigne][ColPiv];

cout<<")*L"<<NumLigne;

}

cout<<endl;

}

cout<<endl;

}//---Fin d'affichage du tableau et des opérations effectuer sur les lignes //---Recherche des pivots successifs (fonction Gauss_Jordan)--- void Gauss_Jordan()

{

NbPivots = 0;//initialisation du nombre de pivots trouvés à O //LigPiv et ColPiv sont le n° de ligne et de colonne où on espère //touver le pivot non nul

LigPiv=1;

ColPiv=1; //la recherche des pivots commence ligne 1, colonne 1 while (LigPiv<=p && ColPiv<=n)

{

if (Tab[LigPiv][ColPiv] != 0) //on a trouvé un pivot non nul { NumLigne = LigPiv;

AfficherSystemeOperations(); //sans échange de lignes Operations();

LigPiv++; //on passe à la ligne suivante ColPiv++; //on passe à la colonne suivante //pour chercher le pivot suivant }

else //si le "Pivot" Tab[LigPiv][ColPiv] est nul {

bool Trouve=false; //indicateur de pivot trouvé ou non

//tant qu'on ne trouve pas de pivot non nul sous Tab[LigPiv][ColPiv]

//(qui est nul) et qu'on a pas parcouru tous les éléments situés sous

(4)

//Tab[LigPiv][ColPiv] on cherche un remplaçant de ce mauvais "pivot nul"

int j=i+1;

while (j<=p && !Trouve) {

if (Tab[j][ColPiv] !=0) //si terme non nul {

NumLigne = j;

Trouve = true; //on a un pivot à la ligne j>LigPiv }

j++; //on passe à la ligne suivante }

if (!Trouve) {

ColPiv++;

//on a pas trouvé de pivot en colonne ColPiv, //on passe à la colonne suivante

//(toujours en ligne LigPiv) }

else

{ //avant l'échange des lignes : NumLigne et LigPiv

AfficherSystemeOperations();//on affiche les opérations à faire Echange(NumLigne,LigPiv);

//on remet la ligne du pivot à sa place (ligne LigPiv) //avant de faire les opérations pour le pivot qui sera //à nouveau Tab[LigPiv][ColPiv] :

NumLig=LigPiv;

Operations();

LigPiv++; //on passe à la ligne suivante ColPiv++; //on passe à la colonne suivante

//pour la recherche du pivot suivant }

} }

}//---Fin Recherche des pivots successifs (fonction Gauss_Jordan) --- //---Début de l'affichage du tableau "nu"(sans opérations à faire)-- void AfficherTableau()

{

for (int i=1;i<=p;i++) {

for (int j=1;j<=n;j++) {

cout<<setw(10)<<setprecision(4)<<fixed<<Tab[i][j];

}

cout<<setw(10)<<setprecision(4)<<fixed<<"| "<<Tab[i][n+1]<<endl;

}

cout<<endl;

}//---Fin d'affichage du tableau "nu" ---

//---Début d'affichage des solutions du système--- void AfficherSolutions()

{ cout<<"Nombre de pivot(s) trouve(s) : "<<NbPivots<<endl;

//si nombre de pivots < nombre d'équations

//Système avec solution(s) seulement si les seconds membres //correspondant aux premiers membres nuls (donc après la ligne BbPivots) sont tous nuls :

bool Possible = true;

(5)

while((i <= p)&& (Possible)) //si le nombre de pivots est p ce "while" ne fait rien { if (Tab[i][n+1] != 0)

{

Possible = false; //si un des seconds membres correspondants } // n'est pas nul le système est impossible i++;

} }

if (!Possible) {

cout<<"Systeme impossible à résoudre"<<endl;

} else

{ if (NbPivots == p) //et non pas n !!!

{

cout<<"Solution unique : "<<endl;

} else {

cout<<"Systeme indetermine, solutions :" <<endl;

}

//Affichage des solution(s) du système bool TrouvePivot;

for (int i=1;i<=NbPivots;i++)

{ // le pivot de la ligne i est en colonne n° Tab[i][0]

// on tire l'inconnue correspondant au pivot en fonction des // autres s'il y en a

cout<<"X"<<setw(10)<<setprecision(4)<<fixed<<Tab[i][0]<<" = ";

// on affiche le second membre

cout<<setw(10)<<setprecision(4)<<fixed<< Tab[i][n+1];

// on explore la ligne après le pivot

// s'il y a des coefficients non nuls les variables // correspondantes padssent dans le second membre j=Tab[i][0]+1;

while(j<=n)

{ if (Tab[i][j]> 0) {

cout<<" -(";

cout<<setw(10)<<setprecision(4)<<fixed<< Tab[i][j];

cout<<")*X"<<j;

} else

{ if (Tab[i][j]< 0) {

cout<<" +(";

cout<<setw(10)<<setprecision(4)<<fixed<<-Tab[i][j];

cout<<")*X"<<j;

} } }

}

(6)

}

}//---Fin d' affichage les solutions du système--- //========== FIN DE FICHIER SOURCE ========================================

Pour définir les opérations à faire une fois le pivot trouvé (encadré) Se fixer les idées en regardant les tableaux selon les cas :

Pivot (encadré) "à sa place" :

Pivot (encadré) "non à sa place" :

Pour la sortie des solutions : 1.- si Nbpivots =p (et si n=p) :

1 0 0 0 0 * 0 1 0 0 0 * 0 0 1 0 0 * 0 0 0 1 0 * 0 0 0 0 1 *

dans chaque équation l'inconnue correspondant au pivot est égale au second membre, 1 2 ... ... ... ColPiv ... ... ... ... ... ... ... j ... ... ... n n+1

1 2

LigPiv

i p

T[

LigPiv

][

ColPiv

] T[

LigPiv

][

j

]

T[

i

][

ColPiv

] T[

i

][

j

]

T[

LigPiv

][

n+1

]

T[

i

][

n+1

]

1 2 ... ... ... ColPiv ... ... ... ... ... ... ... j ... ... ... n n+1

1 i LigPiv

NumLig p

T[

NumLig

][

ColPiv

]

T[

LigPiv

][

j

] 0

T[

NumLig

][

j

]

T[

LigPiv

][

n+1

]

T[

NumLig

][

n+1

] T[

i

][

ColPiv

] T[

i

][

j

]

T[

i

][

n+1

]

(7)

2.- Si NbPivots =p (et si n > p) :

Tirer les inconnues correspondant aux pivots en fonction des autres 3.- si Nbpivots < p :

1 2 NbPivots

p

1 0 * 0 * * * * 0 1 * 0 * * * *

0 0 0 1 * * * *

0 0

0 0 0 0 0 0 0

0

≠0 0 0 0 0 0 0 0 0

 

  lignes des pivots

 

 

les seconds membres n' étant pas tous nuls le système est impossible

4.- si Nbpivots < p : 1 2

NbPivots

p

1 0 * 0 * * * * 0 1 * 0 * * * * 0 0 0 1 * * * * 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

 

 

ces lignes permettent de tirer les p inconnues correspondant aux pivots (en fonction des autres si Nbpivots< n)

  

 

car les seconds membres étant tous nuls ces équations

sont satisfaites et le système est possible

Références

Documents relatifs

Les exercices du sujet suivant constituent une base d’argumentation pour l’entretien : vous préparerez des réponses que vous devrez être capable de justifier (par exemple à

Non : comme toutes les ondes, les ondes sismiques se propagent sans transport de matière mais avec transport d’énergie.. 2.3 Une onde est longitudinale si la direction de

3- Ne cessant d’améliorer notre commande, nous avons constaté qu’un phénomène d’oscillation de l’eau autour d’un niveau provoque de nombreux démarrage et arrêt

22182 Equipement et maintenance extraordinaire des bâtiments sans destination spécifique non valorisés au bilan de départ et monuments. II.B

Le résultat central de notre analyse suggère qu’en mathématiques, les classes dans lesquelles les enseignants présentent les plus forts degrés de discrimination positive envers

Dans cette dernière partie, on va chercher à déterminer le nombre d’élements de F à coefficients entiers positifs (carrés magiques).. Déterminer des conditions nécessaires

– C’est une boucle utilis´ ee quand le nombre d’it´ erations est connue et que celles-ci sont index´ ees par un entier. – Le pas est donn´ e ` a la suite de

Dans le menu de configuration basique, premier paramètre du menu, sélec tionner le mode Spécial et saisir le temps d'impulsion et le temps de pause souhaité. Dans le menu