VI.2 - Méthode De Sauriau - Faddev
Objectif : calcul des coefficients du polynôme
caractéristique
Soit A une matrice carrée; dans cette méthode
les coefficients ai sont obtenus comme suit :
a0= (+1) n
A1=A a1= (+1) n x trace (A1)
B1=A1+a1I
A2=B1A a2= ((+1) n /2) x trace (A2)
B2=A2+a2I
. . .
. . .
. . .
An=Bn+1A an= ((+1) n
/n) x trace (An)
Le programme
//TP1 1 Calcul Numérique
//Calcul des coefficients du polynome caractéristique
//Méthode de Sauriau Faadev
#include<iostream.h> #include<iomanip.h>
#include<conio.h> #include<math.h>
#include<alloc.h>
double **DefMat(int n,int m)//allocation dynamique d'une
matrice
{double * *M=(double* *)malloc(n*sizeof(double*));
for(int i=0;i<n;i++)
M[i]=(double*)malloc(m*sizeof(double));
return M;
}
void remplir(double **A,int n,int m)//remplissage d'une
matrice
{int x=0,y=wherey(); for(int i=0;i<n;i++)
{for(int j=0;j<m;j++)
{gotoxy(x+=8,y);
cin>>A[i] [j]; }
x=0;
y++;
}
}
void print(double **A,int n,int m)//affichage d'une matrice
{int x=0,y=wherey(); for(int i=0;i<n;i++)
{for(int j=0;j<m;j++)
{gotoxy(x+=8,y);
cout<<setw(8)<<setfill('
')<<setprecision(2)<<A[i] [j];
}
x=0;
y++;
}
}
double Trace(double **A,int n)//Calcul de la trace d'une
matrice
{double trace=0;
for(int i=0;i<n;i++) trace+=A[i] [i];
return trace;
}
double **ProduitMat(double **B,double **A,int n,int p,int m)
//Produit matriciel de 2 matrices {double * *tmp=DefMat(n,m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{double t=0;
for(int k=0;k<p;k++) t+=B[i][k]*A[k][j];
tmp[i] [j]=t;
}
return tmp;
}
void copy(double **A,double **B,int n,int m) //copier matrice A
dans B
{for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
B[i][j]=A[i][j];
}
double **AplustI(double **A,int n,double t) //calcul de B=A+tI
{double * *B=DefMat(n,n);
copy(A,B,n,n);
for(int i=0;i<n;i++) B[i][i]+=t;
return B;
}
int MoinsUn(int dim)//-1 pour degre impaire 1 pour degre paire
{int tmp=1;
if(dim%2) tmp=-1;
return tmp;
}
//calcul des coefficients par methode de Sauriau
double *Sauriau(double **M,int n)
{double *coef=(double*)malloc((n+1 )*sizeof(double));
double * *A=DefMat(n,n);
copy(M,A,n,n);
coef[0]=1 ;//le 1er coefficient
for(int k=1 ;k<=n;k++)
{double tr=-1 *Trace(A,n);
coef[k]=tr/k;
double * *B=AplustI(A,n,coef[k]);
double * *tmp=ProduitMat(B,M,n,n,n);
copy(tmp,A,n,n);
free(tmp);
free(B);
}
free(A);
//produit des coeficients par -1 si degre impaire
// et par 1 si degre paire
int u=MoinsUn(n); if(u==- 1)
for(int i=0;i<n+1 ;i++) coef[i] *=u;
return coef;
}
void main()
{clrscr();
cout<<"\t\t\tMethode de Sauriau Faadev\n\t pour le calcul
des coefficients du Polynome Caracteristique"<<endl;
cout<<"Entrer La Dimension De La Matrice :";int
dim;cin>>dim;
double * *Mat=DefMat(dim,dim);
remplir(Mat,dim,dim);
double *Coef=Sauriau(Mat,dim);
for(int i=0;i<=dim;i++) cout<<"a"<<i<<" =
"<<Coef[i]<<endl;
free(Mat);free(Coef); getch();
}
VII - Recherche De La Valeur Approchée De La
Plus Grande Racine D'un Polynôme de
Degré n
Parmi les problèmes de l'analyse numérique, le
problème de résolution de polynôme de degré >
2.
Pour ça plusieurs méthodes sont apparues, parmi
ces méthode on trouve :
-Méthode De G ra effe
-Méthode De Bernoulli
|