begin process at 2010 03 20 05:13:34
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > INVERSION DE MATRICES

INVERSION DE MATRICES


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths Niveau :Débutant Date de création :30/05/2004 Vu :15 434

Auteur : Vb Lover

Ecrire un message privé
Site perso
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

Ce code permet de trouver l'inverse d'une matrice. L'intérêt est qu'il utilise la méthode de Gauss (échelonner-réduire) au lieu du calcul du déterminant, des cofacteurs... Ceci permet d'avoir une complexité polynomiale en N, et non exponentielle, mais enfin pour être clair : ça va beaucoup plus vite pour les grandes matrices !

Source

  • option base 1
  • Private Sub MsgErrBox(ByVal Message As String)
  • MsgBox Message, vbCritical, "Inversion de matrices"
  • End
  • End Sub
  • Private Function InverseMatrice(ByRef Matrice() As Double) As Double()
  • Dim i As Integer, j As Integer, k As Integer
  • Dim n As Integer
  • Dim M() As Double, MInv() As Double
  • Dim Temp As Double
  • n = UBound(Matrice, 1)
  • ' vérifie que la matrice est une matrice carrée
  • If UBound(Matrice, 2) <> n Then MsgErrBox "La matrice n'est pas carrée !"
  • ' crée la matrice n x 2n, composée par M et la matrice identité
  • ReDim M(n, 2 * n)
  • For i = 1 To n
  • For j = 1 To n
  • M(i, j) = Matrice(i, j)
  • M(i, j + n) = 1 - Sgn(Abs(i - j))
  • Next
  • Next
  • ' échelonne la matrice M()
  • For i = 1 To n
  • ' trouve le pivot (1er élément <> 0)
  • j = i
  • While M(j, i) = 0
  • j = j + 1
  • If j > n Then MsgErrBox "La matrice n'est pas inversible !"
  • Wend
  • ' échange les 2 lignes si elles sont différentes
  • ' commence à partir de l'élément i, car tous les précédents sont nuls
  • If i <> j Then
  • For k = i To 2 * n
  • Temp = M(i, k)
  • M(i, k) = M(j, k)
  • M(j, k) = Temp
  • Next
  • End If
  • ' le pivot devient égal à 1
  • If M(i, i) <> 1 Then
  • Temp = M(i, i)
  • For j = i To 2 * n
  • M(i, j) = M(i, j) / Temp
  • Next
  • End If
  • ' sous le pivot, tous les éléments deviennent nuls
  • For j = i + 1 To n
  • If M(j, i) <> 0 Then
  • Temp = M(j, i)
  • For k = i To 2 * n
  • M(j, k) = M(j, k) - M(i, k) * Temp
  • Next
  • End If
  • Next
  • Next
  • ' réduit la matrice M()
  • For i = n To 2 Step -1
  • For j = 1 To i - 1
  • If M(j, i) <> 0 Then
  • Temp = M(j, i)
  • For k = i To 2 * n
  • M(j, k) = M(j, k) - M(i, k) * Temp
  • Next
  • End If
  • Next
  • Next
  • ' retourne le résultat : la deuxième partie de la matrice M()
  • ReDim MInv(n, n)
  • For i = 1 To n
  • For j = 1 To n
  • MInv(i, j) = M(i, j + n)
  • Next
  • Next
  • InverseMatrice = MInv
  • End Function
option base 1

Private Sub MsgErrBox(ByVal Message As String)
    MsgBox Message, vbCritical, "Inversion de matrices"
    End
End Sub

Private Function InverseMatrice(ByRef Matrice() As Double) As Double()
Dim i As Integer, j As Integer, k As Integer
Dim n As Integer
Dim M() As Double, MInv() As Double
Dim Temp As Double

    n = UBound(Matrice, 1)
    
    ' vérifie que la matrice est une matrice carrée
    If UBound(Matrice, 2) <> n Then MsgErrBox "La matrice n'est pas carrée !"
    
    ' crée la matrice n x 2n, composée par M et la matrice identité
    ReDim M(n, 2 * n)
    For i = 1 To n
        For j = 1 To n
            M(i, j) = Matrice(i, j)
            M(i, j + n) = 1 - Sgn(Abs(i - j))
        Next
    Next
    
    ' échelonne la matrice M()
    For i = 1 To n
        ' trouve le pivot (1er élément <> 0)
        j = i
        While M(j, i) = 0
            j = j + 1
            If j > n Then MsgErrBox "La matrice n'est pas inversible !"
        Wend
        ' échange les 2 lignes si elles sont différentes
        ' commence à partir de l'élément i, car tous les précédents sont nuls
        If i <> j Then
            For k = i To 2 * n
                Temp = M(i, k)
                M(i, k) = M(j, k)
                M(j, k) = Temp
            Next
        End If
        ' le pivot devient égal à 1
        If M(i, i) <> 1 Then
            Temp = M(i, i)
            For j = i To 2 * n
                M(i, j) = M(i, j) / Temp
            Next
        End If
        ' sous le pivot, tous les éléments deviennent nuls
        For j = i + 1 To n
            If M(j, i) <> 0 Then
                Temp = M(j, i)
                For k = i To 2 * n
                    M(j, k) = M(j, k) - M(i, k) * Temp
                Next
            End If
        Next
    Next
    
    ' réduit la matrice M()
    For i = n To 2 Step -1
        For j = 1 To i - 1
            If M(j, i) <> 0 Then
                Temp = M(j, i)
                For k = i To 2 * n
                    M(j, k) = M(j, k) - M(i, k) * Temp
                Next
            End If
        Next
    Next
        
    ' retourne le résultat : la deuxième partie de la matrice M()
    ReDim MInv(n, n)
    For i = 1 To n
        For j = 1 To n
            MInv(i, j) = M(i, j + n)
        Next
    Next
    InverseMatrice = MInv
    
End Function



 Sources du même auteur

Source avec Zip SAVOIR SI UN POINT (3D) EST DANS UN TRIANGLE / PYRAMIDE
Source avec Zip Source avec une capture SUDOKU MANIA
Source avec Zip RENOMMER DES FICHIERS, AVEC INCRÉMENTATION
Source avec Zip PUISSANCE 4 AVEC IA
Source avec Zip PLUS COURT CHEMIN ENTRE 2 SOMMETS D'UN GRAPHE

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) COMPILATION A LA VOLÉE, INTERPRÉTER UNE FONCTION MATHÉMATIQU... par sergeb44
Source avec Zip Source .NET (Dotnet) PISH2010-VB2008 par SaintMaur
Source avec Zip Source avec une capture PI-SH-2010-VB6 par SaintMaur
Source avec Zip Source avec une capture CHIFFRAGE ET DECHIFFRAGE FONCTION AFFINE par tresorsdevie
ALGORITHME DE NIVEAU POUR LA RÉSOLUTION DU MÉTHODE POTENTIEL... par sagessekaye

Commentaires et avis

Commentaire de dhatov le 29/09/2004 17:46:54

Merci pour ton zèle, VB Lover !
Ca sert à + d'un !

Commentaire de hopallo le 25/11/2004 02:29:02

Commentaire de ehectsamira le 23/04/2005 18:13:25

merci

Commentaire de gabrielgarcin le 29/04/2005 16:33:11

Bonjour.

J'ai utilisée cette source pour résoudre un système linéaire de n équations à n inconnues.
ça marche trés bien.
Mais la précision peut laisser à désirer si les éléments de la diagonale sont d'un ordre de grandeur nettement inférieur aux autres.
Celà provient certainement du fait que l'on utilise le premier pivot non nul et non le pivot maximum.

Je propose donc l'amélioration suivante :

Remplacer
____________________________________________
' trouve le pivot (1er élément <> 0)
        j = i
        While M(j, i) = 0
            j = j + 1
            If j > n Then MsgErrBox "La matrice n'est pas inversible !"
        Wend
____________________________________________

Par

____________________________________________
' trouve le pivot maximum
        j = i
       Max = 0
       For k = j To n
        If Abs(m(k, i)) > Max Then
        jmax = k
        Max = Abs(m(k, i))
        End If
        Next k
                    If Max = 0 Then MsgErrBox "La matrice n'est pas inversible !"
        
        j = jmax
____________________________________________

Gabriel GARCIN

Commentaire de fvcpp le 04/05/2005 13:16:23

merci VB Lover pour le code :) et Gabriel pour la modif, ca marche nickel chrome pile poil.. enfin tout ca quoi :p
very usefull ;)
++

Commentaire de lepongiste le 29/12/2006 14:32:11

Je dois réaliser un programme sous VB permettant toutes les opérations classiques avec les matrices, à savoir, somme, produit, calcul du déterminant, calcul de l'inverse ... Mais ce n'est pas tant l'aspect mathématique et pseudo-code qui me gène mais plutôt la création de l'interface. Je ne suis pas un crac en programmation et je ne sais pas comment créer une matrice l lignes et c collonnes qui soit vierge et à remplir par l'utilisateur, ni comment l'utiliser dans le programme.
Si l'un d'entre-vous pouvait me filer un coup de main il sera le bien venu.

Merci d'avance.

Commentaire de soumydjem le 04/02/2007 22:26:16

es-que vous pouvez lz traduire en langage C j'en ai vraiment besoin de sa

Commentaire de Maritime le 10/02/2008 23:29:50

Bonjour,
Cette question peut paraitre bête, mais je la pose quand même !
En appelant la fonction InverseMatrice(Matrice()) Je ne reçois rien en retour.
mais en faisant un debug.print Minv(i,j)a l'intérieur de la fonction, ça marche.
Merci.


Commentaire de batou7 le 05/11/2009 16:03:42

Bonjour,

Où doit-on positionner le debug.print Minv(i,j) dans la fonction pour pouvoir exploiter la matrice inversée?

Je fais appel à cette fonction à l'intérieur d'une macro et je n'arrive pas à récupérer les coefficients de la matrice inverse.
Également cette fonction ne m'affiche rien dans excel.

D'avance merci!

Commentaire de Vb Lover le 06/12/2009 01:20:49

la fonction n'affiche rien, en effet. Il suffit simplement de déclarer 2 tableaux, disons A et B, n'importe où dans le code, définir les valeurs de A, puis appeler la fonction :
B = InverseMatrice(A)
Tous les coefficients de la matrice inverse peuvent ensuite être récupérés dans B :
debug.print B(i,j)

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales