Inverser une matrice 120*120
Bonjour à toutes et à tous,
voici mon problème:
Je dois faire des calculs sous EXCEL qui nécessite l'inversion d'une matrice de taille 120 par 120. Cependant la fonction pré enregistré d'EXCEL INVERSEMAT est limité à une matrice de taille 50*50. Je me suis donc mis à l'écriture d'une fonction sur vba en pensant que l'algorithme d'inversion de Gauss serait suffisant pour inverser une grande matrice. Cependant le résultat est le même, je suis bloqué à 50*50.
Je me demande juste si il est possible ou si quelqu'un sait, si c'est possible d'inverser une grande matrice.
Parce que si je trouve pas une solution sous excel il va falloir que je crée une dll sous scilab afin de faire mon calcul.
Merci beaucoup de l'aide que vous pouvez m'apporter.
Amicalement
Grego1re
Bonjour grego1re, forum,
Peux-tu poster ici l'algorithme que tu as programmé ?
Voici le code de l'algorithme que j'ai programmé, pour faire l'inversion
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
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
' é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 Functionet avec cette algorithme je suis limité à une matrice de taille 50*50 et je ne sai spas pourquoi.
merci de votre aide.
Grego1re
voici le code qui me permet de charger la matrice
Function load_matrix()
Dim nb_rows, i, j As Integer
Dim matrix() As Double
nb_rows = Range("C9").End(xlDown).Row - 8
ReDim matrix(nb_rows, nb_rows)
Debug.Print nb_rows
For i = 1 To nb_rows
For j = 1 To nb_rows
matrix(i, j) = Cells(i + 8, j + 2)
Next j
Next i
Debug.Print i, j
load_matrix = matrix
End Function
[/quote]
et enfin le main qui me petrmet de gérer le tout
[quote] Option Base 1
Sub Main()
Dim Matrice() As Double
Dim inverse() As Double
Dim Verif() As Double
Dim inverse2() As Double
Dim i, j, k As Integer
Worksheets("Correlation").Activate
Matrice = load_matrix()
nb_rows = UBound(Matrice, 1)
'Récupere la mise en forme de la feuille correlation
'cette partie correspond à la mise en forme de la zone de reception
Cells.Select
Selection.Copy
Sheets.Add.Name = "inverse"
ActiveSheet.Paste
ReDim inverse(nb_rows, nb_rows)
'calcul de l'inverse appel de la fonction inverse et impression sur une nouvelle feuille excel
inverse = InverseMatrice(Matrice)
For i = 1 To nb_rows
For j = 1 To nb_rows
Cells(i + 8, j + 2) = inverse(i, j)
Next j
Next i
'cette partie réinverse la matrice afin de faire les vérification
Sheets.Add.Name = "inverse2"
ActiveSheet.Paste
ReDim inverse2(nb_rows, nb_rows)
'calcul de l'inverse
inverse2 = InverseMatrice(inverse)
For i = 1 To nb_rows
For j = 1 To nb_rows
Cells(i + 8, j + 2) = inverse2(i, j)
Next j
Next i
'cette partie fait le produit matricielle de la matrice et de son inverse afin de trouver la matrice identité.
'produit matriciel
Sheets.Add.Name = "verif"
ReDim Verif(nb_rows, nb_rows)
For i = 1 To nb_rows
For j = 1 To nb_rows
For k = 1 To nb_rows
Verif(i, j) = Verif(i, j) + Matrice(i, k) * inverse(k, j)
Next k
Cells(i + 8, j + 2) = Verif(i, j)
Next j
Next i
End SubAïe ! A la lecture de tout ceci, j'ai bien peur que mes connaissances sont trop limitées pour pouvoir t'aider.
Peut-être qu'en joignant un bout de fichier cela faciliterait la tâche mais je doute un peu.
C'est pas grave, merci de ton aide,
j'ai peur qu'un bout de fichier n'aide pas vraiment, mais bon si ça peut servir!
sinon si quelqu'un sait importer une telle matrice sous SCILAB, je suis preneur!
on sait jamais!
Merci de votre aide
amicalement
Grego1re
ps j'ai joint la matrice à inverser
Une solution serait d'utiliser la fonction INVERSEMAT.EXT programmée par Laurent Longre et qui est contenue dans son package "Morefunc".
Va sur logitheque.com et fais une recherche avec "Morefunc".
La syntaxe de INVERSEMAT.EXT est la même que INVERSEMAT sans les limitations de cette dernière.
Merci du conseil,
est ce que tu sais ou je peux le télécharger, parce que je ne trouve pas de lien valide!
merci de ton aide.
Grego1re
Edit:
meric de l'info, normalement cela devrait fonctionner, mais cela ne le fait pas!!! je pense que c'est un problème de config de la machine.
Voici une adresse de telchargement
http://download.cnet.com/Morefunc/3000-2077_4-10423159.html
pour info excel 2007 ne connait pas ce problème, il a été corrigé.
La question que je me pose maintenant, c'est comment est ce que cela se fait que sur mon pc, je ne peux pas meme en programmant, faire des grandes opérations. (programme que j'ai écrit et même l'add on ne fonctionne pas)
je ne pense pas être le seul a être confronté à ce genre de problème, donc si quelqu'un a une idée, ça pourrait servir.
Amicalement.
Grego1re