Gauss-jordan

0/5 (6 avis)

Snippet vu 10 314 fois - Téléchargée 30 fois

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

Ajouter un commentaire Commentaires
cs_leFeu
Messages postés
22
Date d'inscription
samedi 25 mars 2006
Statut
Membre
Dernière intervention
18 février 2009

17 févr. 2009 à 14:28
SVP, je trouve une difficulté a utilisé ce code, C'est presque le mme problème cité, celui de la variable c qui s'incrémente, et par moment elle peu declenché une exception,
y a il une solution????
merci
hasnaoui_karim
Messages postés
1
Date d'inscription
lundi 20 février 2006
Statut
Membre
Dernière intervention
30 août 2006

30 août 2006 à 16:44
il s'agit de mon code source qui à la base marche tres bien et je n'ai jamais demandé de le rajouter. Je lui ai juste demander de donner une note à mon code. Donc si il y a un problème sur celui ci je ne suis pas responsable.

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

16 juil. 2006 à 20:34
salut,
comme je l'ai écrit je ne sais plus où, je n'ai pas codé cela, c'est une autre personne qui m'a demandé de le mettre en ligne car il avait un pb avec la notation du code qui ne marchait pas je crois.
Donc vu que je n'ai pas utilisé ce code, je ne peux pas répondre à vos questions.
Désolée et bon courage.
mathieu44470
Messages postés
1
Date d'inscription
mercredi 6 octobre 2004
Statut
Membre
Dernière intervention
13 juillet 2006

13 juil. 2006 à 18:04
J'ai le meme probleme que ISMOUCHE. Pour une matrice 32x32, une erreur apparait car
k+c+q*dim >= 32*32

Que veux-tu dire par tenseurs d'ordre 2 ?

Ta fonction est bien sensée marcher quelque soit la taille (carrée) de la matrice non?
cs_ismouche
Messages postés
1
Date d'inscription
dimanche 9 avril 2006
Statut
Membre
Dernière intervention
6 mai 2006

6 mai 2006 à 15:04
Salut;
j'ai essayé d'utiliser ce programme pour inverser une matrice 7*7 , le programme me donne un message d'erreur.
le probleme reside dans la valeur de "c", car à un moment donné le [k+c+q*dim] se trouvant dans cette boucle s'accroi et depasse la dimension des vecteurs.
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];

je vous remercie d'avance pour les eventuels eclaircissements.

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.