Algorithme de gauss-jordan

Soyez le premier à donner votre avis sur cette source.

Snippet vu 43 410 fois - Téléchargée 28 fois

Contenu du snippet

algorithme de gauss-jordan qui inverse une matrice carrée. la fonction gauss-jordan utilise deux fonctions,
l'une qui rempli une matrice par la matrice indentité et l'autre qui copie une matrice dans une autre.
fonction qui ne marche que pour des tenseurs de rang 2.

Notation:
une matrice A(i,j) de dimension dim*dim s'ecrit dans le code
A[i+j*dim]

dim est superieur ou égale à 2.

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
   {
    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 :


// Karim Hasnaoui
// GRAND ACCELERATEUR NATIONAL D'IONS LOURDS,
// Boulevard Henri Becquerel,
// B.P. 55027, 14076 CAEN Cedex, France
// bureau 282
// E-mail: Hasnaoui@ganil.fr
// tel: 0033 (0)2 31 45 49 25

A voir également

Ajouter un commentaire

Commentaires

Messages postés
3
Date d'inscription
vendredi 14 avril 2006
Statut
Membre
Dernière intervention
13 mars 2008

Salut,
alors moi aussi j'ai besoin d'un code en C ou java de pref (car je connais pas le C++) pour faire je cite:
"Méthode de Gauss-Jordan pour la résolution de systèmes linéaires et l'inversion de matrices: on utilisera la structure [A|Id|b] qui permet d'obtenir en même temps l'inverse de A et la solution du système A.x=b".

Le code proposé plus haut ne marche pas chez moi, je c pas s'il y a des erreurs ou quoi mais ça ne marche pas !!
Please HELP ME!!!

Paulon.
Messages postés
71
Date d'inscription
mercredi 17 juillet 2002
Statut
Membre
Dernière intervention
20 avril 2008

salut,

Ligne 43: ya pas de fonction identiteR(complex<double>[],int) de défini dans ton bout de code !

Il me semble bien (dans l'état) que tu as une fuite de mémoire initialisé à la ligne 37 (new ...), ya pas de delete à priori pour temp!

Toujours dans cette même fonction, si l'utilisateur de ta fonction, lors de son appel, met 0 à la valeur de dim. Oui tu as compris ce que je voulais dire et tu pourrais éviter au processeur du travail inutile !

Enfin, sachant que le code est mis en "débutant", pourrais-tu mettre un main et les includes nécessaires pour effectuer les tests ?


voilà, et sinon tu fais quoi au ganil ?
.Mick.


ps: code utile pour les exos de math en tout cas :)
oula! mes p'tites matrices ...

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.