Pour inverser une matrice!

Soyez le premier à donner votre avis sur cette source.

Snippet vu 19 482 fois - Téléchargée 31 fois

Contenu du snippet

c est tout simplement le code pour inverser une matrice (carrée mais est ce la peine de le preciser?) avec le formule théorique, qui à dit qu'elle ne servait à rien?
utile pour ceux qui ont des programmes un tantinet (lol) mathématiques à développer.

Source / Exemple :


/*
 j espere que vous vous rappelez de la formule...
 calcul de l'inverse de M via la formule théorique

  • /
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],m2[max][max],d; d=(1/determinant(ma,l)); coffacteur(ma,m1,l); transp_mat(m1,m2); multi_R(d,m2,mb); }

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
15 avril 2011

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();
}
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
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é."
Messages postés
54
Date d'inscription
dimanche 27 février 2005
Statut
Membre
Dernière intervention
21 juin 2007
1
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
Messages postés
37
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
13 avril 2006

on est d accord
mais le fait est que cela marche sans problème
et puis tu sais je travaille pas pour mathlab! (lol)
Messages postés
241
Date d'inscription
mardi 29 octobre 2002
Statut
Membre
Dernière intervention
23 janvier 2006

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)...
Afficher les 8 commentaires

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.