POUR INVERSER UNE MATRICE!

MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006 - 3 mai 2005 à 18:54
emerynho Messages postés 1 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 15 avril 2011 - 15 avril 2011 à 01:34
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31162-pour-inverser-une-matrice

emerynho Messages postés 1 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 15 avril 2011
15 avril 2011 à 01:34
Salut à tous,
je bosse sur un projet dont le but est de résoudre une système de N équations à N inconnues par la méthode de Newton raphson.
J'ai besoin d'écrire une fonction C capable d'inverser une matrice prise en entrée.Grâce à PINDUS et à mes connaissances en programmation, je suis arrivé à ce code.
Cependant, je n'arrive pas à inverser les matrices que j'entre.
Le résultat affiché en ligne de commande est semblable à celui-ci:

ENTRER LES VALEURS
5
9
8
7
6
0.5
8.98
0.23
65
1.#INF001.#INF001.#INF001.#INF001.#INF00-1.#QNAN01.#INF001.#INF001.#INF00

J'ai besoin qu'on m'aide à trouver le bug.
Je vous remercie.

voici le code en question

/*
j espere que vous vous rappelez de la formule...
calcul de l'inverse de M via la formule théorique
*/
#include<stdio.h>
#include<math.h>
#include<conio.h>
const int max=3;
//int nombre;
void transp_mat(float ma[max][max],float mb[max][max])
{
int i,j;
for (i=0;i<max;i++)
{
for (j=0;j<max;j++)
{
mb[j][i]=ma[i][j];
}
}
}

void det_aux(float ma[max][max],float mb[max][max],int l,int c) /*calcul du mineur*/
{
int i,j,d,e=0;
for(i=0;i<max;i++)
{
d=0;
if(i!=l)
{
for(j=0;j<max;j++)
if(j!=c)
{
mb[e][d]=ma[i][j];
d++;
}
e++;
}
}
}

float expo(int n) /*fonction signe*/
{
if(!(n%2))
{
return (1);
}
return (-1);
}

float determinant(float m[max][max],int l)
{
int i;
float m2[max][max],x=0;

if(l==1)
{
return m[0][0];
}
for(i=0;i<l;i++)
{
det_aux(m,m2,i,0);
x=x+(expo(i)*m[i][0]*determinant(m2,(l-1)));
}
return x;
}

void multi_R(float a,float ma[max][max],float mb[max][max])
{
int i,j;
for(i=0;i<max;i++)
{
for(j=0;j<max;j++)
{
mb[i][j]=ma[i][j]*a;
}
}
}

void coffacteur(float ma[max][max],float mb[max][max],int l)
{
int i,j;
float m2[max][max];
if (l==1)
{
mb[0][0]=1;
}
else
{
for (i=0;i<l;i++)
{
for (j=0;j<l;j++)
{
det_aux(ma,m2,i,j);
mb[i][j]=expo(i+j)*determinant(m2,(l - 1));
}
}
}
}

void inverse(float ma[max][max],float mb[max][max],int l)
{
float m1[max][max];
float m2[max][max];
float d;
d=(1/determinant(ma,l));
coffacteur(ma,m1,l);
transp_mat(m1,m2);
multi_R(d,m2,mb);
}

main (){
void inverse(float ma[max][max],float mb[max][max],int l);
float mat1[max][max];
float mat2[max][max];
int l2;
int i, j;
printf("ENTRER LES VALEURS\n");
for (i=0;i<max;i++){
for (j=0;j<max;j++){
scanf("%f",&mat1[i][j]);
}
}
inverse(mat1,mat2,l2);
for (i=0;i<max;i++){
for (j=0;j<max;j++){
printf("%f",mat2[i][j]);
}
}
getch();
}
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
4 mai 2005 à 16:47
taranael, je suis entierement d'accord avec toi
SURTOUT sur le
"Et d'ailleurs je n'ai pas eu le culot de le mettre en initié."
Taranael Messages postés 54 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 21 juin 2007 1
4 mai 2005 à 16:41
J'ai peut-être été un peu agressif mais je déteste que le niveau du code soit surévaluer , et si tu regardes les codes en niveau Initié c'est d'un autre niveau ...
Sinon j'aime pas le shéba je préfère le Ronron :D
cs_Pindus Messages postés 37 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 13 avril 2006
4 mai 2005 à 11:25
on est d accord
mais le fait est que cela marche sans problème
et puis tu sais je travaille pas pour mathlab! (lol)
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
4 mai 2005 à 10:51
Non, ce n'est pas la methode la plus simple, mais le probleme c est qu elle est tellement lente qu elle devient impraticable.
Par exemple pour inverser une matrice 20x20 tu vas devoir patienter... patienter... et pour une matrice 70x70 (ce qui est relativement peu) tu n y arriveras jamais (plus de 10^100 operations)...
cs_Pindus Messages postés 37 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 13 avril 2006
4 mai 2005 à 09:53
metaldwarf, je né jamais pretendu que c était la methode la plus simple...

taranael, je ne sais pas ce que tu as mais je te trouve bien aggressif! (arrete le sheba!! lol)
Taranael Messages postés 54 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 21 juin 2007 1
3 mai 2005 à 22:27
J'ai déposé une classe qui fait la presque totalité des calculs sur les Matrices il y a 4-5 jours et j'ai utilisé cette formule. Et d'ailleurs je n'ai pas eu le culot de le mettre en initié.
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
3 mai 2005 à 18:54
Tu inverses la matrice en utilisant la matrice des cofacteurs?
Ou la mais c est super lent ca, d ailleurs c est pour ca qu elle ne sert a rien cette formule (enfin si dans plein de problemes mais jamais en pratique).
La methode du pivot de Gauss est bien plus rapide a l execution, un calcul de determinant c est en O(n!) avec la methode que tu emploies, et donc ton inversion de matrice aussi, alors qu avec le pivot de Gauss c est en O(n^3) ou O(n^4) je ne sais plus
Rejoignez-nous