l

 


 

Méthode de Gauss Jordan  - Matrice inverse

·  #include <iostream>

·  #include <cmath>

·  using namespace std;

·  ·  void identite(double mat[],int dim);

·  void copie_matriceR(double mat1[],double mat2[],int dim);

·  void gaussR(double mat1[],double mat2[],int dim);

·  ·  int main()

·  {

·  //exemple d'utilisation pour une matrice 2x2

·  int dim=2;

·  double *M=new double[dim*dim];

·  double *M_inv=new double[dim*dim];

·  //remplissage de la matrice M

·  M[0+0*dim]=2.;

·  M[0+1*dim]=4.8;

·  M[1+0*dim]=6.2;

·  M[1+1*dim]=5.1;

·  //inversion de la matrice M

·  gaussR(M,M_inv,dim);

·  //affichage des elements de matrice inverse

·  for(int i=0;i<dim;i++)

·  {

·  for(int j=0;j<dim;j++)

·  {

·  cout<<M_inv[i+j*dim]<<" "<<;

·  }

·  cout<<endl;

·  }

·  ·  ·  }

·  ·  //fonction qui rempli une matrice

·  //par la matrice identité

·  void identite(double mat[],int dim)

·  {

·  for(int i=0;i<dim;i++)

·  {

·  for(int j=0;j<dim;j++)

·  {

·  if(i==j)

·  {

·  mat[i+j*dim]=1.;

·  }

·  else

·  {

·  real(mat[i+j*dim])=0.;

·  imag(mat[i+j*dim])=0.;

·  }

·  }

·  }

·  ·  //fonction qui copie une matrice dans une autre

·  void copie_matriceR(double mat1[],double mat2[],int dim)

·  {

·  for(int i=0;i<dim;i++)

·  {

·  for(int j=0;j<dim;j++)

·  {

·  mat2[i+j*dim]=mat1[i+j*dim];

·  }

·  }

·  }

·  ·  //la matrice mat1 est celle qui est à inverser

·  //et l'inverse est contenu dans mat2

·  void gaussR(double mat1[],double mat2[],int dim)

·  {

·  double *temp=new double[dim*dim];

·  copie_matriceR(mat1,temp,dim);

·  double a,b;

·  a=0.;

·  b=0.;

·  int c=0;

·  identite(mat2,dim);

·  for(int k=0;k<dim;k++)

·  {

·  a=temp[k+k*dim];

·  //verifie la condition "a" different de zero

·  //sinon on copie une ligne pour resoudre le probleme

·  c=0;

·  while(abs(a)<0.000000001)

·  {

·  c++;

·  for(int q=0;q<dim;q++)

·  {

·  temp[k+q*dim]=temp[k+q*dim]+temp[k+c+q*dim];

·  mat2[k+q*dim]=mat2[k+q*dim]+mat2[k+c+q*dim];

·  }

·  a=temp[k+k*dim];

·  }

·  //normalisation la ligne k

·  for(int l=0;l<dim;l++)

·  {

·  temp[k+l*dim]=temp[k+l*dim]/a;

·  mat2[k+l*dim]=mat2[k+l*dim]/a;

·  }

·  //reduction de gauss-jordan

·  for(int i=0;i<dim;i++)

·  {

·  b=temp[i+k*dim];

·  if(i!=k)

·  {

·  for(int j=0;j<dim;j++)

·  {

·  temp[i+j*dim]=temp[i+j*dim]-b*temp[k+j*dim];

·  mat2[i+j*dim]=mat2[i+j*dim]-b*mat2[k+j*dim];

·  }

·  }

·  }

·  }

·  delete(temp);

·  }