inverse matrice en c - Algo - Programmation
Marsh Posté le 15-12-2006 à 12:42:34
balises code stp, c'est illisible.
Ensuite, c'ets pour apprendre le pivot de gauss ou l'utiliser ?
Si c'est pr l'utiliser, je te conseil d'utiliser LAPACK ou une de ces interfaces C comme LPP
Marsh Posté le 14-03-2009 à 21:30:53
Pour celui ou celle qui voudrait utiliser ce programme, la fonction MethodeGauss() inversant la matrice a juste une petite erreur. Le bon code de cette fonction est:
Code :
|
Les résultats que la fonction donnent ont été vérifiés avec un logiciel scientifique (Matlab).
Marsh Posté le 16-03-2009 à 08:21:14
couli sur l'inventino de la roue quoi v_v
use LAPACK please
Marsh Posté le 15-12-2006 à 11:01:01
Salut tout le monde,
j'essaye de coder un programme qui inverse une matrice avec l'algo de Gauss. Si je le déroule à la main, ca fonctionne.Mais à l'éxecution, j'ai des valeurs completement inexactes.
Je me demande si c'est pas les float qui pose probleme???
Merci d'avance Voici le code c :
#include <stdio.h>
#include <math.h>
#define t 3
float matId[t][t];
float mat1[t][t] = {{1,8,5},{4,3,2},{1,0,8}};
float NewMat[t][2*t];
void afficherMatrice()
{
int i,j;
for (i=0;i<t;i++)
{
for (j=0;j<t;j++)
{
printf("%f ",mat1[i][j]);
}
printf("\n" );
}
}
void afficherMatriceIdentite()
{
int i,j;
for (i=0;i<t;i++)
{
for (j=0;j<t;j++)
{
printf("%f ",matId[i][j]);
}
printf("\n" );
}
}
void afficherMatriceInverse()
{
int i,j;
float elem;
for (i=0;i<t;i++)
{
for (j=t;j<2*t;j++)
{
printf("%f ",NewMat[i][j]);
}
printf("\n" );
}
}
void creerMatriceId()
{
int i,j;
for (i=0;i<t;i++)
{
for (j=0;j<t;j++)
{
if (i==j)
{
matId[i][j] = 1;
}
else
{
matId[i][j] = 0;
}
}
}
}
void definirNouvelleMatrice()
{
int i,j;
i=j=0;
for (i=0;i<t;i++)
{
for (j=0;j<2*t;j++)
{
if (j<t)
{
NewMat[i][j] = mat1[i][j];
}
else
{
NewMat[i][j] = matId[i][j-t];
}
}
}
}
int MethodeGauss()
{
int inversible = 1;
int k,i,colonne,colonnebis;
float var,var1;
k=0;
while((inversible == 1)&&(k<t))
{
if (NewMat[k][k] != 0)
{
var = NewMat[k][k];
for (colonne=0;colonne<2*t;colonne++)
{
NewMat[k][colonne] = NewMat[k][colonne]/var; //Normalisation de la ligne contenant l'élément diagonal
for (i=0;i<t;i++)
{
if (i != k)
{
var1=NewMat[i][k];
for (colonnebis=0;colonnebis<2*t;colonnebis++)
{
NewMat[i][colonnebis] = NewMat[i][colonnebis] - NewMat[k][colonnebis]*var1;
}
}
}
}
k++;
}
else
{
inversible = 0;
}
}
return inversible;
}
void modifierMatrice()
{
creerMatriceId();
definirNouvelleMatrice();
}
int main ()
{
printf("debut\n" );
afficherMatrice();
modifierMatrice();
if (MethodeGauss() == 1)
{
printf("Matrice inverse\n" );
afficherMatriceInverse();
}
else
{
printf("La matrice n'est pas inversible\n" );
}
printf("tout c'est bien termine\n" );
return 0;
}