Nous cherchons a créer un programme C++ qui donne les solutions d'un système de type :
c'est un système de n équation et de n inconnus .
la méthode la plus facile pour résoudre ce type de systèmes est la méthode de Gauss , cette méthode consiste a faire des opérations - addition , multiplication , permutation - sur les lignes du système affin d'obtenir un système triangulaire supérieur équivalent de la forme :
( les aii ne sont pas les mêmes du premier système ,on montre juste la forme )
notre système linéaire sera représenté comme un tableau de réels a 2 dimensions contenant N lignes et N+1 colonnes ( une colonne de plus pour les bii ) .
on donne la fonction creerSys qui crée le tableau , elle est définit comme indiqué suivant :
Question 1 : définir une fonction de prototype void afficher( double ** sys , int N ) qui permet de faire l'affichage du système . (Solution )
Question 2 : définir une fonction de prototype void permuterLigns(double** sys , int N , int i , int j ) qui permute les valeurs de la ligne Li avec les valeurs de la ligne Lj dans le système sys . ( Solution )
les opérations que nous pouvons faire pour l'obtention d'un système linéaire équivalent sont , la multiplication d'une ligne par un scalaire , remplacer une ligne par sa somme avec une autre ligne .
on peut même faire des combinaisons entre ces opérations , par exemple on peut remplacer la ligne Li par Li+xLj .
Question 3 : définir une fonction de prototype void sommerLigns(double** sys, int N, int i, double x, int j) qui permet de réaliser cette opération dans le système sys . ( Solution )
A connaitre : le pivot de la ligne Li et le premier coefficient non nul dans cette ligne .
Question 4 : définir une fonction de prototype int nbr0avantPivot( double** sys , int N , int i ) qui compte et renvoie le nombre des 0 situé avant le pivot dans la ligne Li . ( Solution )
le premier pas pour rendre le système triangulaire supérieur est annuler tout les coefficient au dessous de chaque pivot :
par exemple : si on a le système suivant ( on a mis juste la représentation matricielle pour simplifier )
pour la première ligne , le pivot est le nombre 2 .
le résultat serait donc :
Question 5 : définir une fonction de prototype void annulerSousPivots( double** sys , int N ) qui annule les coefficients sous touts les pivot du système sys . ( Solution )
après l'appelle de cette fonction , il suffit d'arranger les lignes en faisant des permutations pour triangulariser le système .
Question 6 : définir une fonction de prototype void arrangerLigns( double** sys , int N ) qui rend le système triangulaire . ( Solution )
Maintenant puisque le système est triangulaire
il est facile de déterminer les xi .
en démarre de la dernière ligne :
Question : pourquoi quand ann on a mis xn=0 et on a pas mis autres valeurs ?
bonne question , un système linéaire peut avoir plusieurs solutions ,une infinité .
notre programme ne va pas donner toutes ces solutions , il vas nous donne juste
une seule , la solution la plus facile est c'elle qui contient plus de 0 , c'est pour cela qu'en impose au quelque inconnus la valeur 0 .
Question 7 : définir une fonction de prototype double * resoudre( double ** sys , int N ) qui renvoie un tableau de N réels contenant les valeurs des xi , c'est a dire qui renvoie la solution du système . ( Solution )
Question 8 : définir une fonction de prototype bool verifierResultat( double ** sys , int N , double * sol ) qui vérifie le résultat s'il est une solution ou non . ( Solution )
Question 9 : écrire un programme qui permet a l'utilisateur de saisir les coefficients et l'ordre d'un système linéaire , et affiche la solution de ce système s'elle existe . ( Solution )
c'est un système de n équation et de n inconnus .
la méthode la plus facile pour résoudre ce type de systèmes est la méthode de Gauss , cette méthode consiste a faire des opérations - addition , multiplication , permutation - sur les lignes du système affin d'obtenir un système triangulaire supérieur équivalent de la forme :
{a11x1+a12x2+....+a1nxn=b1a22x2+....+a2nxn=b2:annxn=bn
( les aii ne sont pas les mêmes du premier système ,on montre juste la forme )
notre système linéaire sera représenté comme un tableau de réels a 2 dimensions contenant N lignes et N+1 colonnes ( une colonne de plus pour les bii ) .
on donne la fonction creerSys qui crée le tableau , elle est définit comme indiqué suivant :
double ** creerSys(int N){
double ** sys;
sys = new double*[N];
int i,j;
for(i=0;i<N;i++)
sys[i] = new double[N+1];
//remplissage
for(i=0;i<N;i++){
for(j=0;j<N+1;j++){
if ( j == N ) cout << "= ";
cin >> sys[i][j];
}
cout << "--------------------------" << endl;
}
return sys;
}
l’accès a une valeur dans le tableau est donc donné par sys[ i ][ j ] avec 0 ≤ i ≤ N-1 , 0 ≤ j ≤ N .Question 1 : définir une fonction de prototype void afficher( double ** sys , int N ) qui permet de faire l'affichage du système . (Solution )
Question 2 : définir une fonction de prototype void permuterLigns(double** sys , int N , int i , int j ) qui permute les valeurs de la ligne Li avec les valeurs de la ligne Lj dans le système sys . ( Solution )
les opérations que nous pouvons faire pour l'obtention d'un système linéaire équivalent sont , la multiplication d'une ligne par un scalaire , remplacer une ligne par sa somme avec une autre ligne .
on peut même faire des combinaisons entre ces opérations , par exemple on peut remplacer la ligne Li par Li+xLj .
Question 3 : définir une fonction de prototype void sommerLigns(double** sys, int N, int i, double x, int j) qui permet de réaliser cette opération dans le système sys . ( Solution )
A connaitre : le pivot de la ligne Li et le premier coefficient non nul dans cette ligne .
Question 4 : définir une fonction de prototype int nbr0avantPivot( double** sys , int N , int i ) qui compte et renvoie le nombre des 0 situé avant le pivot dans la ligne Li . ( Solution )
le premier pas pour rendre le système triangulaire supérieur est annuler tout les coefficient au dessous de chaque pivot :
par exemple : si on a le système suivant ( on a mis juste la représentation matricielle pour simplifier )
[02490580921−600050−790]
pour la première ligne , le pivot est le nombre 2 .
on peut annuler tous les coefficients au dessous de 2 en faisant les opérations :
- remplacer la ligne L2 par L2−82L1 .
- remplacer la ligne L3 par L3+62L1 .
- remplacer la ligne L4 par L4−02L1 .
le résultat serait donc :
[0249050−16−272101227050−790]
Question 5 : définir une fonction de prototype void annulerSousPivots( double** sys , int N ) qui annule les coefficients sous touts les pivot du système sys . ( Solution )
après l'appelle de cette fonction , il suffit d'arranger les lignes en faisant des permutations pour triangulariser le système .
Question 6 : définir une fonction de prototype void arrangerLigns( double** sys , int N ) qui rend le système triangulaire . ( Solution )
Maintenant puisque le système est triangulaire
{a11x1+a12x2+....+a1nxn=b1a22x2+....+a2nxn=b2:annxn=bn
il est facile de déterminer les xi .
en démarre de la dernière ligne :
si ann≠0 on trouve donc xn=bnann
si ann=0 et on met tous simplement xn=0 .
et d’après l'avant dernière ligne : an−1,n−1xn−1+an−1,nxn=bn−1 avec xn est connu , on calcule xn−1 et en passe a la ligne précédente .
avec cette procédure on trouve toutes les xi
cette méthode nous donne toujours une solution pour tous système , mais il y a des systèmes qui n’admettent pas de solutions , pour cela il faut toujours vérifier que le résultat trouvé s'agit vraiment d'une solution .
lorsque le résultat n'est pas une solution , le système et donc n'admet pas de solution .
et d’après l'avant dernière ligne : an−1,n−1xn−1+an−1,nxn=bn−1 avec xn est connu , on calcule xn−1 et en passe a la ligne précédente .
avec cette procédure on trouve toutes les xi
cette méthode nous donne toujours une solution pour tous système , mais il y a des systèmes qui n’admettent pas de solutions , pour cela il faut toujours vérifier que le résultat trouvé s'agit vraiment d'une solution .
lorsque le résultat n'est pas une solution , le système et donc n'admet pas de solution .
Question : pourquoi quand ann on a mis xn=0 et on a pas mis autres valeurs ?
bonne question , un système linéaire peut avoir plusieurs solutions ,une infinité .
notre programme ne va pas donner toutes ces solutions , il vas nous donne juste
une seule , la solution la plus facile est c'elle qui contient plus de 0 , c'est pour cela qu'en impose au quelque inconnus la valeur 0 .
Question 7 : définir une fonction de prototype double * resoudre( double ** sys , int N ) qui renvoie un tableau de N réels contenant les valeurs des xi , c'est a dire qui renvoie la solution du système . ( Solution )
Question 8 : définir une fonction de prototype bool verifierResultat( double ** sys , int N , double * sol ) qui vérifie le résultat s'il est une solution ou non . ( Solution )
Question 9 : écrire un programme qui permet a l'utilisateur de saisir les coefficients et l'ordre d'un système linéaire , et affiche la solution de ce système s'elle existe . ( Solution )
Aucun commentaire :
Enregistrer un commentaire