WOW !! MUCH LOVE ! SO WORLD PEACE !
Fond bitcoin pour l'amélioration du site: 1memzGeKS7CB3ECNkzSn2qHwxU6NZoJ8o
  Dogecoin (tips/pourboires): DCLoo9Dd4qECqpMLurdgGnaoqbftj16Nvp


Home | Publier un mémoire | Une page au hasard

 > 

TPs Calcul Numérique

( Télécharger le fichier original )
par Salim Merazga
Oum El Bouaghi - 3eme informatique 2007
  

précédent sommaire suivant

Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy

VI.1 - Méthode De Krylov

Objectif : calcul des coefficients du polynôme caractéristique

Cette méthode repose sur la résolution du système linéaire BX=C Où la matrice B est construite comme suit :

On note les colonnes de la matrice B par bj ; j : 1, n Soit X0 vecteur donné.

bn=X0

bn-1=AX0 bn-2=A2X0

.
.
.

b1 =An+1X0

et le vecteur C=AnX0

et par l'utilisation de la méthode de Gauss on obtient n coefficients + le premier (+1) n.

Le programme

//TP10 Calcul Numérique

//Calcul des coefficients du polynome caracteristique //Méthode de Krylov

#include<iostream.h> #include<iomanip.h> #include<conio.h> #include<math.h> #include<alloc.h>

//////////////////Structure pour le programme de Gauss///////////////////////

struct PosMax //enregistrement pour le maximum

{int IL;int JC;};

//enregistrement pour la solution

struct solution {double x;int indice;};

//////////////////////////////Fin////////////////////////////////////////////////

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++;

}

}

//produit d'une matrice A avec vecteur V

double *ProduitAV(double **A,double *V,int n)

{double *tmp=(double*)malloc(n*sizeof(double));

for(int i=0;i<n;i++)
{double som=0;

for(int l=0;l<n;l++) som+=A[i] [l] *V[l];

tmp[i]=som;

}

return tmp;

}

//calcul de A puissance P fois le vecteur V

double *puissance(double **A,double *V,int n,int p)

{

for(int i=0;i<p;i++) V=ProduitAV(A,V,n);

return V;

}

//-1 a la puissance de n int MoinsUn(int n) {int tmp=-1;

for(int i=1 ;i<n;i++) tmp*=-1;

return tmp;

}

//////////////////////////Methode de Gauss//////////////////////////////////// //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);

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.00000000001) {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.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;

}

/////////////////////////////////////Fin////////////////////////////////////// void main()

{clrscr();

cout<<"\t\tMethode De Krylov\n";

cout<<"Donner Le Dimension De La Matrice :";

int n;cin>>n;//dimension de la matrice

double * *C=DefMat(n,n);

cout<<"Donner La Matrice \n";

remplir(C,n,n);//remplissage de la matrice

double *V=(double*)malloc(n*sizeof(double)); cout<<"Donner Le Vecteur V \n";

for(int j=0;j<n;j++) cin>>V[j] ;//la saisie du vecteur initial double **B=DefMat(n,n);//allocation dynamique de la mtrice B //construction de la matrice B

for(int i=0;i<n;i++)

{double *coef=puissance(C,V,n,i);

for(j=0;j<n;j++) B [j] [n-i-1 ]=coef[j];

}

//affichage de la matrice B

cout<<"La matrice B\n";

print(B,n,n);

cout<<endl;

//construction du vecteur Xn

double *Xn=puissance(C,V,n,n);

cout<<"Le vecteur Xn"<<endl;

//affichage du vecteur Xn

for(j=0;j<n;j++) cout<<Xn[j]<<endl;

////////////////////////////////Methode de Gauss///////////////////////////////// int dim;

dim=n;

solution *X=(solution*)malloc(dim*sizeof(solution)); for(i=0;i<dim;i++) X[i] .indice=i;//initialisation des indices

//Declaration de la matrice augmente double * *A=DefMat(dim,dim+1); //initialisation de A

for(i=0;i<n;i++)

for(j=0;j<n;j++)

A[i][j]=B[i][j];

for(i=0;i<n;i++) A[i] [n]=Xn[i];

int ok=triangul(A,dim,dim+1 ,X);//triangularisation if(ok)

{ cout<<"Matrice Triangulée\n";

print(A,dim,dim+1 );//A triangule

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 Coefficient Du Polynome Caracteristique Sont :\n"; cout<<endl;

for(i=0;i<n;i++) X[i] .x*=(-1 );//multiplication des solutions par -1

int t=MoinsUn(dim);//multiplication des solutions par -1 puissance n for(i=0;i<n;i++) X[i] .x*=t;

dim%2?cout<<"a0 = -1 ":cout<<"a0 = 1 ";cout<<endl;//affichage du 1er coef for(i=0;i<dim;i++) cout<<"a"<<(X[i] .indice)+1 <<" = "<<(X[i] .x)<<endl;

}

else cout<<"La solution a une erreur plus grande"; }

free(X);free(A);//liberation memoire

////////////////////////////////Fin//////////////////////////////////////////// free(C);free(V);free(B);free(Xn);//liberation memoire getch();

}

précédent sommaire suivant






Extinction Rebellion







Changeons ce systeme injuste, Soyez votre propre syndic



"Et il n'est rien de plus beau que l'instant qui précède le voyage, l'instant ou l'horizon de demain vient nous rendre visite et nous dire ses promesses"   Milan Kundera