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

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');

}

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








"Des chercheurs qui cherchent on en trouve, des chercheurs qui trouvent, on en cherche !"   Charles de Gaulle