Inversion de matrices

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

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.