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






Extinction Rebellion







Changeons ce systeme injuste, Soyez votre propre syndic



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