Gauss-jordan

Contenu du snippet

Résolution par la méthode de Gauss-Jordan d'un système linéaire

Source / Exemple :


#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);
}

Conclusion :


Remarque: ceci est le code de Hasnaoui Karim modifié!

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.