Option Private Module Option Base 1 'pour commencer à 1 au lieu de 0 Public Function Matrice_inverse(M() As Double, size As Integer) As Double() 'fonction calculant l'inverse d'une matrice à partir de l'algorithme (pivot de Gauss) Dim M_Id() As Double, MInv() As Double Dim Tempo As Double, pivot As Double 'Vérification que la matrice est carrée If UBound(M, 2) <> UBound(M, 1) Then MsgBox "La matrice n'est pas carrée !" 'Représentation de Gauss, création de la matrice composée par M et la matrice identité à sa droite (size*2size) ReDim M_Id(size, 2 * size) For i = 1 To size For j = 1 To size M_Id(i, j) = M(i, j) If i = j Then M_Id(i, j + size) = 1 Else M_Id(i, j + size) = 0 End If Next Next 'Traitement de Gauss sur la matrice M_Id() pour inverser la matrice M() For j = 1 To size 'Partir de la première colonne i = j 'Partir de la première ligne ' trouve le pivot maximum Max = 0 For k = i To size If Abs(M_Id(k, j)) > Max Then imax = k Max = Abs(M_Id(k, j)) End If Next If Max = 0 Then MsgBox "La matrice n'est pas inversible !" i = imax pivot = M_Id(i, j) 'Echanger avec la jème ligne si la colonne et la ligne sont différentes If j <> i Then 'Permuter les lignes si elles sont différentes For k = j To 2 * size Tempo = M_Id(j, k) M_Id(j, k) = M_Id(i, k) / pivot 'rendre le pivot égal à 1 M_Id(i, k) = Tempo Next Else 'rendre le pivot égal à 1 For k = j To 2 * size M_Id(j, k) = M_Id(j, k) / pivot Next End If 'Annulation de tous les coefficients après le pivot For i = j + 1 To size 'Après If M_Id(i, j) <> 0 Then Tempo = M_Id(i, j) For k = j To 2 * size M_Id(i, k) = M_Id(i, k) - M_Id(j, k) * Tempo Next End If Next Next For j = size To 2 Step -1 For i = 1 To j - 1 If M_Id(i, j) <> 0 Then Tempo = M_Id(i, j) For k = j To 2 * size M_Id(i, k) = M_Id(i, k) - M_Id(j, k) * Tempo Next End If Next Next 'Remplir la matrice inverse à partir de la partie droite de la matrice M-Id et retourner le résultat ReDim MInv(size, size) For i = 1 To size For j = 1 To size MInv(i, j) = M_Id(i, j + size) Next Next Matrice_inverse = MInv End Function Public Sub multiplication(M1() As Double, M2() As Double, M3() As Double) Dim dimL1 As Long, dimC1 As Long Dim dimL2 As Long dimL1 = UBound(M1, 1) dimC1 = UBound(M1, 2) dimL2 = UBound(M2, 1) If dimC1 <> dimL2 Then MsgBox "les dimensions des deux matrices sont incompatibles" End If ReDim M3(dimL1) For i = 1 To dimL1 M3(i) = 0 For k = 1 To dimC1 M3(i) = M3(i) + M1(i, k) * M2(k) Next Next End Sub
Certaines matrices carrées ne peuvent pas être inversées et renvoient la valeur d'erreur #NUM! avec la fonction MINVERSE. Le déterminant pour une matrice non inversible est 0.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionAvant de partir sur cette méthode, j'ai utilisé worksheetfunction.Minverse (c'étais la première solution que j'ai trouvée) et on m'affichait comme erreur: impossible de lire la propriété minverse de la classe worksheetfunction
et j'y fais appel dans une autre macro dans laquelle je déclare la matrice A et puis je calcule le vecteur B par une simple multiplication. A chaque fois que j'exécute ma macro, ça me donne des valeurs différentes de A^-1 et B.