Precedente Indice Successivo



Qsimp



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
a - reale, estremo inferiore d'integrazione
b - reale, estremo superiore d'integrazione
tol - reale, tolleranza assoluta
maxval - intero, massimo numero di valutazioni

output

q - reale, valore approssimato dell'integrale
e - reale, stima dell'errore
nval - intero, numero di valutazioni occorse
ifail - intero, indicatore d'errore

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