Sistemi lineari



  • Sistemi lineari
    di crazy_guitar (utente non iscritto) data: 04/08/2016 20:17:44

    Salve a tutti,
    sto preparando un applicativo con vba excel in cui devo risolvere dei sistemi di equazioni lineari.
    Ho impostato il codice ma nell'ultima parte (quando applico il comando MMult) mi da un errore. Qualcuno potrebbe aiutarmi? Grazie.

    P.S.: Il codice è tratto da una vecchia discussione del forum.

     
    Sub Sistema_lineare()
    Dim i, j, k, D1, r, c, d, l, m, n, h As Integer
    Dim B(), B1(), v(), x() As Object
    Dim ris As Double
    
    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 termini noti.")
        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 Vecchio Frac data: 04/08/2016 21:22:27

    Anche se non dai info sufficienti (tipo di errore e dove si verifica) mi son preso la briga di controllare, incuriosito soprattutto dal codice terribile che esponi (a cominciare dalle dichiarazioni delle variabili...) :)
    L'errore si verifica qui:
    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

    MMult restituisce una matrice e quindi il suo risultato deve essere assegnato a una variabile vettore (come hai fatto giustamente poco prima con x... stendiamo un velo sul fatto che x è dichiarata "as Object").
    Il codice va scritto un po' meglio e ti invito a farlo tenendo in mente quello che ti ho appena mostrato.






  • di patel data: 04/08/2016 22:12:15

    suggerisco inoltre di inserire coefficenti e termini noti nel foglio in modo da non doverli digitare ogni volta, altrimenti a cosa serve Excel ? vedi allegato