Solutore sistemi lineari



  • Solutore sistemi lineari
    di Lello_6 (utente non iscritto) data: 02/12/2011

    Salve a tutti, sono nuovo del forum, vi saluto e ringrazio in anticipo, da poco mi sono avvicinato al mondo di vba, da autodidatta.
    vengo al dunque sto provando a sviluppare un programmino che mi permetta di risolvere sistemi di equazioni lineari, ho realizzato una prima bozza, ma giunto al momento di moltiplicare la matrice trasposta per il vettore dei termini noti non fa ciò che dovrebbe e cioè non esegue il prodotto righe per colonne (disattivate dagli apici trovate varie prove che ho fatto).
    spero voi possiate aiutarmi a capire dove sbaglio e ad apprezzare ancor più il vba.
     
    Sub Sistema_lineare()
    Dim i, j, k, D1, r, c, d, l, m, n, h As Integer
    Dim B(), B1(), v(), x() As Object
    
    1:
    r = InputBox("Digita numero di righe.")
    If Not IsNumeric(r) Then
    MsgBox "Devi immettere un valore numerico!"
    GoTo 1
    End If
    
    2:
    c = InputBox("Digita numero di colonne.")
    If Not IsNumeric(c) Then
    MsgBox "Devi immettere un valore numerico!"
    GoTo 2
    End If
    
    If r <> c Then
    MsgBox "Se n°righe non = n°colonne non posso continuare."
    Exit Sub
    End If
    
    For i = 1 To c
     For j = 1 To r
        Cells(i, j) = InputBox("Inserisci l'elemento " & i & "," & j & " Della matrice dei coefficienti.")
        If Not IsNumeric(Cells(i, j)) Then
        MsgBox "Devi immettere valori numerici! All' n'facc'!!"
        Exit Sub
        End If
     Next j
    Next i
    
    B = Range(Cells(1, 1), Cells(i - 1, j - 1))
    Range(Cells(1, 1), Cells(i - 1, j - 1)).Select
    B1 = Application.WorksheetFunction.MInverse(B)
    
    For l = 1 To c
     For m = 1 To r
    Range(Cells(1 + i, 1), Cells(i + i - 1, j - 1)).Value = B1
    Next m
    Next l
    
    3:
    d = InputBox("Digita numero di termini noti.")
    If Not IsNumeric(d) Then
    MsgBox "Devi immettere un valore numerico!"
    GoTo 3
    End If
    
    For k = 1 To d
        Cells(k, j + 1) = InputBox("Inserisci l'elemento " & k & ", della matrice dei coefficienti.")
        If Not IsNumeric(Cells(k, j + 1)) Then
        MsgBox "Devi immettere valori numerici! All' n'facc'!!"
        Exit Sub
        End If
    Next k
    v = Range(Cells(1, c + 2), Cells(r, c + 2))
    
    
    x = Application.WorksheetFunction.MMult(Range(Cells(r + 2, 1), Cells(r + r + 1, c)), Range(Cells(1, c + 2), Cells(r, c + 2)))
    
    For n = 1 To d
    
    Cells(n + r + 1, c + 2).Value = Application.WorksheetFunction.MMult(Range(Cells(n + 2, 1), Cells(n + n + 1, c)), Range(Cells(n, c + 2), Cells(n, c + 2)))
    
    Next n
    'For n = 1 To d
     'h = 1
    
    'Cells(n + r + 1, c + 2) = Cells(n + r + h, n) * Cells(h, c + 2) + Cells(n + r + 1, n + 1) * Cells(h + 1, c + 2)
    'Cells(n + r + 1, c + 1 + 1) = Cells(n + r + 1, h) * Cells(n, c + 2) + Cells(n + r + n, h + 1) * Cells(n + 1, c + 2) 'prima era:+ Cells(n + r + 1, n + 1)
    'Da eliminare: Cells(n + r + 1, c + 1 + 1) = (2 * Cells(n, c + 2)) + (2 * Cells(n, c + 2 + n))
    'Cells(n + r + 1, c + 1 + 1) = Cells(n + r + 1, h) * Cells(n, c + 2) + Cells(n + r + 1, h + 1) * Cells(n + h, c + 2)
    'h = h + 1
    
    'Next n
    
    'h = h + 1
    
    
    End Sub
    



  • di Kraken (utente non iscritto) data: 03/12/2011

    Innanzitutto secondo me è fuorviante il fatto che nella stessa operazione ci siano somme e prodotti insieme.
    in informatica prima vengono eseguiti i prodotti poi le somme. io scomporrei in più righe di operazione salvando i risultati su delle variabili, inoltre controllerei che gli indici delle celle siano corretti eseguendo riga per riga con lo strumento di debug.



  • di Lello_6 (utente non iscritto) data: 03/12/2011

    Ciao kraken, grazie per la risposta, ci avevo pensato di sviluppare il tutto per righe, salvando il risultato in delle variabili temporanee, purtroppo però sono solo pochi giorni che armeggio con vba e non ho tutta questa flessibilità, magari se hai tempo puoi mettermi delle linee giusto per capire come fare.
    ciao e grazie ancora