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 Function

et 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 Sub

Aï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

140matrice-exemple.zip (27.58 Ko)

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

Rechercher des sujets similaires à "inverser matrice 120"