Metodo del trapezoide



  • Metodo del trapezoide
    di gaelix98 (utente non iscritto) data: 29/06/2017 02:06:41

    Salve ragazzi, sarò breve, ho l'esame di maturità dello scientifico e volevo portare un codice per risolvere in analisi numerica un integrale definito. Dovrei stampare tutti i vari incrementi di x con "x+h" partendo dall'incremento inferiore "a" fino ad arrivare all'estremo superiore "b". Con replace la y si mostra nella colonna L e uso la formula "h*((ya+yb)/2+ i valori in mezzo)". Il problema credo sia nel ciclo for: Con "step" h,excel crasha.E poi non riesco a spiegarmi perchè mi stampi i valori di x tutti uguali che poi vengono sovrascritti da nuovi valori di x. In pratica è come se gli avessi dato l'ordine di stampare i valori delle x in un ciclo e poi sovrascriverle con il ciclo successivo. Qualcuno può aiutarmi? Grazie
     
    Private Sub CommandButton1_Click()
    Dim a As Variant
    Dim b As Variant
    Dim n As Long
    Dim x As Long
    Dim y As String
    Dim i As Long
    Dim h As Double
    Dim e As Long
    Dim z As Long
    
    
    y = InputBox(" Inserisci una funzione y =")
    Cells(2, 4) = "  " & y
    a = InputBox("Inserisci estremo inferiore")
    Cells(2, 1) = "  " & a
    b = InputBox("Inserisci estremo superiore")
    Cells(2, 2) = "  " & b
    n = InputBox("Inserisci il numero delle parti in cui vuoi dividere l'intervallo")
    Cells(2, 3) = "  " & n
    h = (b - a) / n
    
    
    For z = Range("A2") To b Step h
    x = a + h
    
    i = e
    For i = i + 1 To n + 1
    Cells(i, 11) = x
    
    Next
    Next
    y = Replace(y, "x", "K1")
    Range("L:L") = "=" & y
    Range("E2") = h
    
    
    End Sub
    



  • di Vecchio Frac data: 29/06/2017 08:31:09

    Ci sono diversi errori e tra i più macroscopici segnalo:
    - manca Option Explicit in testa al modulo. Hai dimensionato le variabili come da tecnica ma metti ugualmente la direttiva, che ti salva la vita in caso di errata digitazione;
    - hai sbagliato il tipo delle variabili a e b, Variant si usa in pochi casi definiti (e questo non è tra quei casi);
    - anche x non dovrebbe essere di tipo String;
    - i tipi Long sono interi senza decimali (forse volevi un tipo Single per tener conto di qualche decimale? altrimenti l'approssimazione è maggiore);
    - assegni e ad i (con i = e) ma subito dopo cominci un ciclo con i come contatore facendolo partire da se stesso più uno;
    - all'interno del ciclo, il valore di x non cambia, semplicemente continui ad assegnare alla cella che sta in riga i, colonna 11 il valore (immutato) di x; tale valore cambia ma solo nel ciclo successivo, poi viene ristampato i+1 fino a n+1 volte lo stesso valore;
    - alla fine sostituisci nella stringa y (definita a inizio procedura) la stringa x con la stringa k1 (non con il valore di x ma proprio con il carattere "x");
    - poi ficchi questa stringa y così ridefinita per *tutte le celle* della colonna L.

    Secondo me c'è da studiare qualcosa: prima di tutto l'algoritmo da far eseguire a Excel.
    Quindi fai un esempio concreto dei dati di partenza e del risultato atteso.
    Poi parliamo di come si scrive il codice.





  • di patel data: 29/06/2017 08:54:21

    per testare il codice io toglierei la parte degli input mettendo i dati direttamente nelle celle, poi quando tutto funziona ce la puoi rimettere se credi, io non lo farei comunque, meglio inserire i dati nelle celle ed attivare la macro con un pulsante.





  • di patel data: 29/06/2017 09:07:53

    per testare il codice io toglierei la parte degli input mettendo i dati direttamente nelle celle, poi quando tutto funziona ce la puoi rimettere se credi, io non lo farei comunque, meglio inserire i dati nelle celle ed attivare la macro con un pulsante.

    Hai provato a fare una ricerca con Google ? io ho trovato questo
    www.mrexcel.com/forum/excel-questions/607018-integrals-visual-basic-applications.html

    inoltre hai pensato come trasformare la funzione da integrare assegnata sotto forma di stringa in funzione calcolabile ?
    www.excelvba.it/Forum/story/Visual_Basic_for_Applications/Calcolo_integrale.html





  • di patel data: 29/06/2017 09:26:19

    per testare il codice io toglierei la parte degli input mettendo i dati direttamente nelle celle, poi quando tutto funziona ce la puoi rimettere se credi, io non lo farei comunque, meglio inserire i dati nelle celle ed attivare la macro con un pulsante.

    Hai provato a fare una ricerca con Google ? io ho trovato questo
    www.mrexcel.com/forum/excel-questions/607018-integrals-visual-basic-applications.html

    inoltre hai pensato come trasformare la funzione da integrare assegnata sotto forma di stringa in funzione calcolabile ?
    www.excelvba.it/Forum/story/Visual_Basic_for_Applications/Calcolo_integrale.html

    io credo che la soluzione con macro sia troppo complicata per il tuo scopo e punterei ad una soluzione con sole formule, meno flessibile ma che rende l'idea della soluzione con metodo numerico

    scusate i troppi post, mi è saltata la corrente 3 volte





  • di gaelix98 data: 29/06/2017 14:03:02

    Grazie ad entrambi, ho risolto parte dei problemi. Il codice ho provato a studiarlo, volevo che il codice mi stampasse le x che incrementavano di h (x+h in K1, x + h + h in K2 ecc...) in ogni cella fino ad un valore b. Con replace (che mi sembra funzionare) parte da k1 e fino a che può mi stampa y nella colonna L (cosa che accade) e poi applicare la formula del trapezio che è la parte più facile. La cosa che non riesco a risolvere è perchè non mi stampi un valore per cella e invece mi stampi lo stesso valore in cell diverse più volte.
    Inoltre, vorrei segnalare che ho apprezzato il consiglio di Patel e ho trovato questo codice, che a lui parte e a me no. Nonostante io abbia copiato e incollato ogni singola parola (questo non è il solo codice che ho trovato online, anche altri che risolvono coi moduli funziano online e copiati no come questo qui che allego)
    =Trapezoidal(0,1,10) uguale a 0.746. Se inserisco tre valori, excell mi dà errore e mi fa diventare i tre valori, due valori. (0,110).
     
    Public Function F(x As Double) As Double    
    F = Exp(-(x ^ 2))
    End Function
    Public Function Trapezoidal(xMin As Double, xMax As Double, n As Integer) As Double   
    Dim dx As Double    
    Dim sum As Double   
    Dim y As Double    
    dx = (xMax - xMin) / n   
     sum = (F(xMin) + F(xMax)) / 2#    
    For i = 1 To (n - 1)        
    y = F(xMin + (dx * i))        
    sum = sum + y    
    Next i    
    sum = sum * dx   
    Trapezoidal = sum
    End Function



  • di patel data: 29/06/2017 18:04:59

    non capisco, la seguente sub mi restuisce b = 0.746
     
    Sub a()
    b = Trapezoidal(0, 1, 10)
    MsgBox b
    End Sub






  • di gaelix98 data: 29/06/2017 19:28:35

    Patel è esattamente così che dovrebbe venire l'area se fatta la funzione in quel modo con quei dati.
    Solo che a me restituisce "#valore!". Mi puoi dire come hai fatto per farla funzionare?



  • di patel data: 29/06/2017 19:38:07

    ho soltanto copiato il tuo codice ed ho aggiunto la sub che ti ho mostrato, ti allego il file





  • di gaelix98 data: 29/06/2017 21:21:33

    grazie mille, adesso mi studio un po' come funziona!