Calcul de l'inverse d'une matrice

Fermé
Maz - Modifié le 17 mai 2008 à 19:52
 nidhaljemaia - 5 nov. 2011 à 00:48
salut! j'ai besoin d'écrire une fonction en langage C qui calcul l'inverse d'une matrice quelquonce
je n'arrive pas a trouvé l'algorithme
si quelq'un peut m'aider
urgence signalé
merci

18 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
2 mars 2007 à 08:51
template <class T>MATRIX<T>& MATRIX<T>::inverse()
           {
           if (m!=n)
               {
               __ENVOI("inversion de matrices non carré non implémenter!\n");
               return *this;
               }
           MATRIX<T> MM(n),M1(n),Mi1(n),Minv(n);
           MM=*this;
           M1=MM;
           Mi1.Id();
           Minv=Mi1;
           for (int i=0;i<n;i++)
             {
             for (int j=0;j<n;j++)
                 {
                 if (MM(i,i)==0)
                    {
                    __ENVOI("inversion pivot GAUSS impossible : division par 0\n");
                    return *this;
                    }
                 M1(i,j)=MM(i,j)/MM(i,i);
                 Mi1(i,j)=Minv(i,j)/(MM(i,i));
                 }
             MM=M1;
             Minv=Mi1;
             for (int k=0;k<n;k++)// mise zéros de la colonne
             if (k!=i)
             for (int j=0;j<n;j++)
                 {
                 M1(k,j)=MM(k,j)-MM(i,j)*MM(k,i);
                 Mi1(k,j)=Minv(k,j)-Minv(i,j)*MM(k,i);
                 }
             MM=M1;
             Minv=Mi1;
             /*for (int k=0;k<n;k++)//mise à zéro de la ligne. ap essai : pas la peine
             if (k!=i)
             for (int j=0;j<n;j++)
                 {
                 M1(j,k)=MM(j,k)-MM(i,j)*MM(i,k);
                 Mi1(j,k)=Minv(j,k)-Minv(i,j)*MM(i,k);
                 }
             MM=M1;
             Minv=Mi1;*/
             }
           *this=Minv;
           return *this;
           }
ça inverse n'importe quel matrice carré.
précision c'est un morceau d'une classe matrice dont un des membre est la fonction inverse(). n et m sont les dimensions lignes colonnes de la matrice, Id() est une méthode qui transfiorme la matrice en matrice identité. __ENVOI() est une macro qui permet de faire des sorties et de la gestion d'erreur. à par ça, je pense que le reste du code na pas besoin d'explications.
11
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
2 mars 2007 à 16:29
C'est du C++ en effet, mais c'est vraiment pas compliquer !
je te fait des simplifications :
MATRIX& MATRIX::inverse()
           {
           if (m!=n)
               {
               perror("inversion de matrices non carré non implémenter!\n");
               return *this;
               }
           MATRIX MM(n),M1(n),Mi1(n),Minv(n);// déclaration de matrices de taille identique à celle à inverser
           MM=*this;// copie de la matrice à inverser
           M1=MM;
           Mi1.Id();//Mi1 est maintenant une matrice identité
           Minv=Mi1;
           for (int i=0;i<n;i++)
             {
             for (int j=0;j<n;j++)
                 {
                 if (MM(i,i)==0)
                    {
                    perror("inversion pivot GAUSS impossible : division par 0\n");
                    return *this;
                    }
                 M1(i,j)=MM(i,j)/MM(i,i);
                 Mi1(i,j)=Minv(i,j)/(MM(i,i));
                 }
             MM=M1;
             Minv=Mi1;
             for (int k=0;k<n;k++)// mise zéros de la colonne
             if (k!=i)
             for (int j=0;j<n;j++)
                 {
                 M1(k,j)=MM(k,j)-MM(i,j)*MM(k,i);
                 Mi1(k,j)=Minv(k,j)-Minv(i,j)*MM(k,i);
                 }
             MM=M1;
             Minv=Mi1;
            
             }
           *this=Minv;
           return *this;
           }
Voilà. La il est difficile de faire plus simple. C'est vraiment du basique ! Dit ce que tu ne comprend pas, ça ira mieux
4
christiankamewe Messages postés 14 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 novembre 2009
8 nov. 2009 à 11:56
salut ; j'ai un problème , j'ai copié ce code et je l'ai testé car j'avais besoin d'une matrice inverse , mais il ne marche pas , l'as tu vérifié ? est il correct? surtout que j'ai copié aussi le code de la matrice identité et il n'était pas bon; as tu un code me permettant de calculer la matrice inverse et le déterminant.
0
Mish > christiankamewe Messages postés 14 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 novembre 2009
9 nov. 2009 à 04:52
J'ai une solution pour toi, mais il me faudrait ton adresse e-mail, parce que le fichier est une librairie javascript plutôt volumineuse pour être affichée sur le forum. Bref, c'est comme tu veux... C'est un fichier de 56Ko... Plus la documentation de 32Ko...
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297 > christiankamewe Messages postés 14 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 novembre 2009
9 nov. 2009 à 09:51
Je l'ai déjà utilisé, il fonctionne.
Je viens même de tester sur une matrice 2*2.
Mais une erreur n'est pas à exclure.
Donne ta matrice que je teste.
0
christiankamewe Messages postés 14 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 novembre 2009 > Mish
9 nov. 2009 à 10:13
merci d'avance,mon adresse email est: christiankamewe@hotmail.com; cette solution est codée en C++?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297 > christiankamewe Messages postés 14 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 novembre 2009
9 nov. 2009 à 10:16
Il viens de dire "javascript" je suppose donc que ce n'est pas du C++. Mais je m'avance peut être beaucoup ;-)
0
mounir234 Messages postés 174 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 1 mars 2016 12
1 mars 2007 à 23:15
je pourais t'aider si tu veut mais tu doit me dire le fonctionement que tu ve faire parceque je me souvien pas bcp des matrice.
exemple :
l'utilisateure saisi 3 nombre le prog fait la somme et afiche le resultat
2
salut! j'ai besoin d'écrire une fonction en langage pascal qui calcul l'inverse d'une matrice quelquonce
si tu peut m'aider urgence signalé
merci
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297 > s2m3ouia
22 mai 2008 à 11:57
Tu as l'algo message 4 écris en C++ sans template. Il ne doit pas être trop dur à traduire en pascal !
0
Bonjour
voila , un tres bon site pour les gens qui manipule les matrice
https://wims.unicaen.fr/wims/wims.cgi?session=9W44CA83EC.2&+lang=fr&+module=tool%2Flinear%2Fmatrix.fr
2

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MATRIX& MATRIX::inverse()
{
if (m!=n)
{
perror("inversion de matrices non carré non implémenter!\n");
return *this;
}
MATRIX MM(n),M1(n),Mi1(n),Minv(n);// déclaration de matrices de taille identique à celle à inverser
MM=*this;// copie de la matrice à inverser
M1=MM;
Mi1.Id();//Mi1 est maintenant une matrice identité
Minv=Mi1;
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
if (MM(i,i)==0)
{
perror("inversion pivot GAUSS impossible : division par 0\n");
return *this;
}
M1(i,j)=MM(i,j)/MM(i,i);
Mi1(i,j)=Minv(i,j)/(MM(i,i));
}
MM=M1;
Minv=Mi1;
for (int k=0;k<n;k++)// mise zéros de la colonne
if (k!=i)
for (int j=0;j<n;j++)
{
M1(k,j)=MM(k,j)-MM(i,j)*MM(k,i);
Mi1(k,j)=Minv(k,j)-Minv(i,j)*MM(k,i);
}
MM=M1;
Minv=Mi1;

}
*this=Minv;
return *this;
}
2
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
30 avril 2008 à 08:39
pourquoi réécrire ça ?
0
slt S.V.P vus puvez m'aider pour le calcule ledeterminant d'une matricz carée c'est pourresudre un ystemed'equation avecla methode decramer .merci à tousle monde
2
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
26 nov. 2007 à 08:38
la question était sur l'algorithme d'une inversion de matrice pas le code en entier. Pour afficher et exécuté, il faut faire le programme qui va autour, donc voir sur autre messages.
Précision sur l'algorithme présenté ici, il s'agit de l'inversion par pivot de Gauss. La méthode consiste à prendre deux matrice, celle à inverser MM et une matricve identité Mi1. Ensuite, on applique différentes opérations à la matrice à inverser afin de la faire devenir identité. En même temps, les mêmes opérations sont appliquées à la matrice identité. à la fin, la matrice initialement identité est l'inverse cherché.
1
gsn-mao Messages postés 1 Date d'inscription mardi 4 décembre 2007 Statut Membre Dernière intervention 4 décembre 2007 1
4 déc. 2007 à 20:01
qu'est-ce que vous voulez dire au début:
if (m!=n)?
vous utilisé plusieurs fois! "!" est-ce que c'est factoriel?
1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
5 déc. 2007 à 09:11
hum... une petite recherche sur le langage C/C++ te permettrai de répondre à cette question.
le ! est tout simplement le not logique. Et encore, là ce n'est pas '!', mais '!=', c'est à dire différent.
a!=b est équivalent à !(a==b)
1
ninaaa Messages postés 1 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 12 décembre 2007 1
12 déc. 2007 à 21:02
svp j ai besoin d'aide je ss encore debutante g besoin de resoudre cet algo : ecrire un algo qui permet de calculer le produit C(n,n) de deux matrices carré A(n,n) et B(n,n) sachant que : Ci,j=la somme de k=1 jusqu'à n ai,k*bk,j svp c urgent!!!!!!!!!!!!!
1
Voilà comment calculer un produit matriciel de type Amn * Bnp. C'est en JavaScript, c'est-à-dire un language pour faire des pages web... Il n'y a rien de plus simple. Vous copiez-collez dans bloc-notes, et vous enregistrez... Testé sous IE7. Désolé pour l'indentation irrégulière.

<html><body><textarea cols="40" rows="20" id="test"></textarea><script language="javascript">

function MISHTeK_Maths_Matrix_MatrixProduct(a,b)
{
dataA=MISHTeK_Maths_Matrix_Props(a);
if(dataA==-1)
return -1;
dataB=MISHTeK_Maths_Matrix_Props(b);
if(dataB==-1)
return -1;
if(dataA[0]!=dataB[1]) //Matrix product requieres this to be false, since sizes would be mismatching.
return -1;
var buffer=MISHTeK_Maths_Matrix_Create(dataA[1],dataB[0]);
for(j=0;j<dataA[1];j++) //Matrix a's height (for row)
for(i=0;i<dataB[0];i++) //Matrix b's width (for column)
{
//i and j specifies the location in the new matrix, while k is acting as Sigma's (sum operator) iterator.
buffer[i][j]=0;
for(k=0;k<dataA[0];k++) //Matrix a's width or b's height (same by definition)
buffer[i][j]+=a[i][k]*b[k][j];
}
return buffer;
}
function MISHTeK_Maths_Matrix_Format(mtrx)
{
data=MISHTeK_Maths_Matrix_Props(mtrx);
if(data==-1)
return -1;
var space="";
for(i=0;i<data[2]-1;i++)
space+=" ";
var buffer="";
for(j=0;j<data[1];j++)
{
buffer+="[";
for(i=0;i<data[0];i++)
{
buffer+=space.substring(0,data[2]-String(mtrx[j][i]).length)+mtrx[j][i];
if(i+1<data[0])
buffer+=" ";
}
buffer+="]";
if(j+1<data[1])
buffer+="\r\n";
}
return buffer;
}
function MISHTeK_Maths_Matrix_Create(w,h,v)
{
var buffer=new Array(h);
for(i=0;i<h;i++)
{
buffer[i]=new Array(w);
for(j=0;j<w;j++)
buffer[i][j]=v;
}
return buffer;
}
function MISHTeK_Maths_Matrix_Props(mtrx)
{
if(!MISHTeK_Maths_Matrix_IsValidMatrix(mtrx))
return -1;
var buffer=new Array(mtrx[0].length,mtrx.length,0); //width, height, max column width
for(i=0;i<mtrx.length;i++)
for(j=0;j<mtrx[0].length;j++)
if(String(mtrx[i][j]).length>buffer[2])
buffer[2]=String(mtrx[i][j]).length;
return buffer;
}
function MISHTeK_Maths_Matrix_IsValidMatrix(mtrx)
{
if(mtrx.length==undefined)
return false;
for(i=0;i<mtrx.length;i++)
{
if(mtrx[i].length!=mtrx[0].length)
return false;
for(j=0;j<mtrx[0].length;j++)
if(mtrx[i][j]==undefined || String(mtrx[i][j])=="")
return false;
}
return true;
}

function Test()
{
var Mtrx1=new Array(new Array(1,2),new Array(3,4));
var Mtrx2=new Array(new Array(5,6),new Array(7,8));
var Mtrx3=MISHTeK_Maths_Matrix_MatrixProduct(Mtrx1,Mtrx2);
document.getElementById("test").value=MISHTeK_Maths_Matrix_Format(Mtrx3);
}
</script></body></html>

Et voilà.

Pour faire fonctionner, remplacer la section en gras par votre matrice. Le premier new Array est nécessaire, il consitue l'ensemble des lignes de la matrice. Pour trois lignes, il faut mettre trois new Array() dans le new Array principal. Puis, il faut mettre des chiffres dans chaque new Array secondaire. Par défaut, il a a une matrice de 2x2 qui s'afficherait comme ceci :
[1  2]
[3  4]


La réponse du calcul s'affiche dans le textarea. Désolé encore une fois pour le code bâtard, mais je l'ai copié d'une de mes librairies de calcul matriciel, et s'aurait été vraiment trop long...
0
slt ,svp si vous pouver m'aider de me donner l'algorithme en pascal qui me permet de calculer le determinant d'une matrice n*n (je veut pas l'idee mais le programm complet svp)

merci à tous
1
svp g besoin de l'algo qui fais l'inverce d'une matrice mais l'algo non pa le programme car je ne metrise pa le c++ urgentttttttttt
1
c simple ta le program , prend n'importe kel matrice inversible ( det#0 ) , une matrice 2*2 c simple ....remplace dans le program que ta (mm en c c pa grave ).... (é sur une feuille bien sur ) suit le étape par étape é là tu poura déduir l'algorythme
0
ou bien vous utilisez la comatrice pour calcuer l'inverse de n'import quelle matrice carré tel que det#0
0
svp je cherche un programme de calcul matricielle tel que le produit matricielle et le calcul de l'inverse d'une matrice qui soit adaptable avec ma calculatrice c'est une casio graph25 merci pour votre aide
1
nidhaljemaia
5 nov. 2011 à 00:48
svp kk1 puvé m aidé a trouver un code sur fortran qui calcule le comatrice
0
salut les gens, j'avoue ne pas avoir tres bien compris le fonctionnement de cet algorithme car mes connaissances en C restent assez elementaire ,alors une solutino plus facile a comprendre serait la bienvenue, merci d'avance , et merci a sniper
0
robertmat Messages postés 8 Date d'inscription dimanche 5 février 2006 Statut Membre Dernière intervention 25 novembre 2007 1
25 nov. 2007 à 11:53
Mais, ou et comment exécuter le programme (Si c'est sur C, comment y proceder) sinon ou voir les résultats.
0
svp g besoin pour m'aider à réaliser un programme en pascal qui affiche et calcul le determinant d'une matrice. je sais pas comment on peut afficher la matrice. merci d'avance
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
30 nov. 2007 à 12:11
pour afficher en pascal, Writeln.
Toujours est il que ce genre de question doit être ouverte dans un nouveau message.
Merci
0
salu svp j cherche solution de( algorithme de la somme d'une diagonale d'une matrice carre)
0