Inversion de matrices

Soyez le premier à donner votre avis sur cette source.

Snippet vu 29 236 fois - Téléchargée 33 fois

Contenu du snippet

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 / Exemple :


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

A voir également

Ajouter un commentaire

Commentaires

dhatov
Messages postés
2
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
29 septembre 2004
-
Merci pour ton zèle, VB Lover !
Ca sert à + d'un !
hopallo
Messages postés
1
Date d'inscription
jeudi 25 novembre 2004
Statut
Membre
Dernière intervention
25 novembre 2004
-
ehectsamira
Messages postés
14
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
11 janvier 2008
-
merci
gabrielgarcin
Messages postés
23
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
30 novembre 2011
-
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
fvcpp
Messages postés
1
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
4 mai 2005
-
merci VB Lover pour le code :) et Gabriel pour la modif, ca marche nickel chrome pile poil.. enfin tout ca quoi :p
very usefull ;)
++

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.