inverse matrice en c

inverse matrice en c - Algo - Programmation

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

Reply

Marsh Posté le 15-12-2006 à 11:01:01   

Reply

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

Reply

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 :
  1. int MethodeGauss()
  2. {
  3.     int inversible = 1;
  4.     int k,i,colonne,colonnebis;
  5.     float var,var1;
  6.     k=0;
  7.     while((inversible == 1)&&(k<t))
  8.     {
  9.             if (NewMat[k][k] != 0)
  10.             {
  11.                 var = NewMat[k][k];
  12.                 for (colonne=0;colonne<2*t;colonne++)
  13.                 {
  14.                     NewMat[k][colonne] = NewMat[k][colonne]/var;  //Normalisation de la ligne contenant l'élément diagonal
  15.                 }
  16.                 for (i=0;i<t;i++)
  17.                 {
  18.                     if (i != k)
  19.                     {
  20.                         var1=NewMat[i][k];
  21.                         for (colonnebis=0;colonnebis<2*t;colonnebis++)
  22.                         {
  23.                             NewMat[i][colonnebis] = NewMat[i][colonnebis] - NewMat[k][colonnebis]*var1;
  24.                         }
  25.                     }
  26.                 }
  27.                 k++;
  28.             }
  29.             else
  30.             {
  31.                 inversible = 0;
  32.             }
  33.     }
  34.     return inversible;
  35. }


 
Les résultats que la fonction donnent ont été vérifiés avec un logiciel scientifique (Matlab).

Reply

Marsh Posté le 16-03-2009 à 08:21:14    

couli sur l'inventino de la roue quoi v_v  
use LAPACK  please

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed