I.1 - Méthode De Gauss Avec Pivot Total Objectif
: résolution d'un système linéaire AX=B
On considère le système linéaire AX = B
suivant :
(Ill au ' · · aln) (x1) (bi
a
n
1
an2
· · ·
annxn
. . . .
.
. . . .
. . . . .
b2bn
=
Le but de cette méthode est de rendre la matrice A
triangulaire (supérieure ou inferieure) c'est-à-dire :
Matrice triangulaire supérieure
(a11 a12 ' · · aln) (x1) (bi
0 a22 · · · a2n x2
. . .
. .. :
. :
. = b2
00
· · ·
annxnbn
Et dans ce cas on peut trouver toutes (es valeurs de Xi par
la méthode itérative suivante (substitution
arrière)
ann
On carcure tout abord xn = bn
Puis
xi =
|
[1ii
|
n
bi -- 1 auxj ; i: n -- 1,1
j=i+1
|
Matrice triangulaire inferieure
(an 0 ... 0 ) (xi) (bi
a21 a22 ... 0 x2
. . . . .
. . . . . .
. . . . . .
_ b2
an
1
an2
· · ·
annxnbn
De manière similaire on peut trouver toutes les
valeurs de Xi par la méthode itérative suivante
(substitution avant)
a11
On carcure tout abord xi = b1
Puis
)6
b -- + ajjXj / ;i:2-- 1,1
,-~
1
*
~))
X) ~
Le programme
//TP1 Calcul Numérique //Méthode de Gauss
#include<stdio.h> #include<alloc.h>
#include<iostream.h> #include<iomanip.h> #include<math.h>
#include<conio.h>
struct PosMax //enregistrement pour le maximum de la matrice {int
IL;int JC;};
//enregistrement pour la solution
struct solution {double x;int indice;};
double **NewMat(int n,int m) //creation dynamique d'une matrice
{double * *mat=(double* *)malloc(n*sizeof(double*));
for(int i=0;i<n;i++)
mat[i]=(double*)malloc(m*sizeof(double));
return mat;
}
void charger(double **mat,int n,int m) //initialisation du
matrice
{ cout<<"Entrer la matrice augmentée\n";
for(int i=0;i<n;i++)
{int x=wherex();
for(int j=0;j<m;j++)
{cin>>mat[i] [j] ;gotoxy(x+=6,wherey()- 1); }
cout<<endl;
x=8;
}
}
void print(double **mat,int n,int m)//afficher une matrice
{for(int i=0;i<n;i++)
{for(int j=0;j<m;j++)
cout<<setfill('
')<<setw(4)<<setprecision(2)<<mat[i] [j]<<"\t";
printf("\n");
}
}
//Chercher la posision du max
PosMax SearchMax(double **mat,int n,int m,int k)
{PosMax max;
max.IL=max.JC=k;
double tmp=fabs(mat[k] [k]);
for(int i=k;i<n;i++)
for(int j=k;j<m;j++)
if(tmp<fabs(mat[i] [j]))
{max.IL=i;max.JC=j;
tmp=fabs(mat[i] [j]);
}
return max;
}
//fonction de la permutation
void permut(double **mat,int n,int m,int k,solution *s)
{PosMax grand=SearchMax(mat,n,n,k);//recherche du max
if(grand.IL != k)
{double inter;
for(int j=k;j<m;j++)
{inter=mat[k] [j] ;mat[k] [j]=mat[grand.IL] [j] ;mat[grand.IL]
[j]=inter; }
}
if(grand.JC != k)
{double inter;
for(int i=k;i<n;i++)
{inter=mat[i] [k] ;mat[i] [k]=mat[i] [grand.JC] ;mat[i]
[grand.JC]=inter; }
int ind=s[k] .indice;s[k] .indice=s[grand.JC] .indice;s[grand
.JC] .indice=ind; }
}
//fonction de la triangularisation
int triangul(double **mat,int n,int m,solution *s,double
eps=0.0001)
{for(int k=0;k<n-1 ;k++)
{permut(mat,n,m,k,s);
if(fabs(mat[k][k]) > eps)
for(int i=k+1 ;i<n;i++)
{double pivot=(double)mat[i] [k]/(double)mat[k] [k];
for(int j=k+1 ;j<m;j++) mat[i] [j]-=pivot*mat[k] [j];
mat[i] [k]=0;
}
else {cout<<"Matrice Singuliere ! ! ! ";return 0; }
}
if(fabs(mat[n- 1] [n-1]) <= eps) {cout<<"Matrice
Singuliere ! ! ! ";return 0; } return 1;
}
//fonction de resolution
void solve(double **mat,int n,int m,solution *s)
{int t=n-1,l=m-1;
s [t] .x=(double)mat[t] [l]/(double)mat[t] [t];
for(int i=t-1 ;i>=0;i--)
{double som=0;
for(int j=i+1 ;j<n;j++) som+=mat[i] [j] *s [j] .x;
s[i] .x=(double)(mat[i] [l] - som)/(double)mat[i] [i];
}
}
//mis on ordre les solution
void ordre(solution *s,int n)
{for(int i=0;i<n;i++)
{int ind=s[i] .indice;
for(int j=i+1 ;j<n;j++) if(ind>s[j] .indice) ind=s[j]
.indice;
if(ind != i)
{solution tmp=s[i] ;s[i]=s[ind] ;s[ind]=tmp; }
}
}
//test des solutions
int test(double **A,int n,int m,solution *s,double eps=0.3)
{for(int i=0;i<n;i++)
{double som=0;
for(int j=0;j<n;j++) som+=A[i] [j] *s[j] .x;
double min=A[i] [m-1] -eps,max=A[i] [m-1 ]+eps;
if((som<min)||(som>max)) return 0;
}
return 1;
}
void main()
{char rep;
do
{clrscr();
cout<<"\t\t Resolution Du Systeme Linéaire
AX=B\n\t\t\tMethode de Gauss\n"; cout<<"Entrer la dimension du matrice
n:";
int dim;
cin>>dim;
solution *X=(solution*)malloc(dim*sizeof(solution));
for(int i=0;i<dim;i++) X[i] .indice=i;//initialisation des
indices
cout<<endl;
//Declaration de la matrice augmentée double
**A=NewMat(dim,dim+1);
charger(A,dim,dim+1 );//initialisation de A
int ok = triangul(A,dim,dim+1 ,X);//triangularisation
cout<<endl;
if(ok)
{ cout<<"Matrice Triangulée\n";
print(A,dim,dim+1 );//A triangulée
cout<<endl;
solve(A,dim,dim+1 ,X);//resolution
ordre(X,dim);//ordonancement des solutions ok=test(A,dim,dim+1
,X);//teste des solutions if(ok)
{ cout<<"Les Solutions Sont :\n";
cout<<endl;
for(i=0;i<dim;i++) cout<<"X"<<X[i]
.indice<<"="<<X[i] .x<<endl;
}
else cout<<"La solution a une erreur plus grande"; }
free(A);free(X);
cout<<"Voulez vous répéter o/n:";
cin>>rep;
free(A);free(X);
}while (rep == 'o');
}
|