Precedente | Indice | Successivo |
Scopo: | calcolo dell'integrale definito di una funzione reale di variabile reale, mediante il metodo di Simpson. |
Specifiche: |
subroutine qsimp(f, a, b, tol, maxval, nval, q, e, ifail) integer maxval, nval, ifail real f, a, b, tol, q, e |
Descrizione: |
Backgroud del problema
Il problema è relativo alla stima approssimata dell'integrale definito di una funzione reale di una variabile reale, e dell'errore commesso nel passaggio dal continuo al discreto. Descrizione dell'algoritmo Si è implementato l'algoritmo di Simpson composito. Questo algoritmo, dati n punti divide l'intervallo di integrazione in n+1 sotto intervalli e applica in ognuno di essi la formula di quadratura di Cavalieri-Simpson L'algoritmo termina se è raggiunta la tolleranza prefissata dall'utente o per il raggiungimento del numero massimo di valutazioni consentite. Raccomandazioni sull'uso La tolleranza inserita deve essere non negativa. Il numero massimo di valutazioni eseguibili deve essere positiva e maggiore di uno. |
Bibliografia: | [1], [3], [5] |
Parametri di I/O: |
input
f - funzione integranda output
q - reale, valore approssimato dell'integrale |
Indicatori d'errore: |
Errori gestiti dalla subroutine: ifail = 0 nessun errore. ifail = 2 la tolleranza assoluta inserita non è valida ifail = 9 il numero massimo di valutazioni è stato raggiunto ifail = 16 il numero di valutazioni richieste non è valido |
Routines ausiliarie: | nessuna |
Tempo d'esecuzione: | dipende dal numero e dalla complessità di valutazioni di f, dalla tolleranza richiesta. |
Memoria richiesta: | nessun array allocato. |
Accuratezza fornita: | l'accuratezza è funzione della tolleranza inserita dall'utente e dal numero massimo di valutazioni consentite. |
Esempio di programma chiamante: |
Program qsimp c Programma dimostrativo della subroutine qsimp external qsimp real f1,f2,f3,f4,f5 external f1,f2,f3,f4,f5 real a, b, q, e, tol integer maxv,val, ifail character risp print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE QSIMP ***' print* 10 continue print*,'Funzione integranda :' print* print*,'1) sin(x)' print* print*,'2) (100/x**2)*sin(10/x)' print* print*,'3) 10*(x-1)*(x-0.5)*(x-0.25)*(x-0.125)*(x-0.0625)', % '*(x-.03125)' print* print*,'4) 1/sqrt(x)' print* print*,'Numero della funzione= ' read(*,*)n print*,'Tolleranza richiesta=' read(*,*)tol print*,'Numero massimo di valutazioni= ' read(*,*)maxv print*,'estremi di integrazione= ' read(*,*)a,b if (n .eq. 1) % call qsimp(f1,a,b,tol,maxv,val,q,e,ifail) if (n .eq. 2) % call qsimp(f2,a,b,tol,maxv,val,q,e,ifail) if (n .eq. 3) % call qsimp(f3,a,b,tol,maxv,val,q,e,ifail) if (n .eq. 4) % call qsimp(f4,a,b,tol,maxv,val,q,e,ifail) if (ifail .eq. 2) % print*,'Errore! tolleranza assoluta non valida' if (ifail .eq. 16) % print*,'Errore! numero di valutazioni non valido' if (ifail .eq. 9) then print*,'Attenzione! raggiunto il numero massimo ', % 'di valutazioni' print* endif write(*,40)'Stima dell''integrale= ',q print* write(*,40)'Stima dell''errore= ',e print* write(*,50)'Valutazioni effettuate= ',val print* print*,'c per continuare, un altro carattere per terminare:' read(*,'(A)')risp if (risp .eq. 'c') goto 10 40 format(1X,A,E14.7) 50 format(1X,A,I6) 60 format(1X,E14.7) End |
Precedente | Indice | Successivo |