Precedente Indice Successivo



Sec



Scopo: risoluzione dell’equazione f(x)=0, calcolo dello zero di una funzione
Specifiche: subroutine sec(f, x1, x2, tolx, tolf, nmax, z, fz, nval, ifail)
integer nmax, nval, ifail
real x1, x2, tolx, tolf, z, fz
Descrizione: Backgroud del problema

Il problema riguarda la risoluzione di una equazione f(x) = 0, con f(x) derivabile.

Descrizione dell'algoritmo

La soluzione è ottenuta implementando l'algoritmo delle secanti. Il metodo delle secanti risolve il principale problema del metodo di Newton, relativo al calcolo della derivata della funzione in oggetto. Il metodo delle secanti, dati due valori di partenza x1 e x2, approssima la derivata con la secante passante per i punti (x1,f(x1)) (x2,f(x2)).

Questo metodo richiede, quindi, due valori iniziali di x, ma non richiede che ci sia cambiamento di segno tra i due valori di f(x). Nell'implementazione dell'algoritmo, non è stata utilizzata direttamente la (7.2), in quanto, in questa formulazione, in vicinanza dello zero potrebbe generare un overflow. La formula implementata è la seguente:

E' una formula più accurata e evita l'overflow se |f(xk) |< |f(xk-1)|

Raccomandazioni sull'uso

Le tolleranze relative devono essere positive, quella relativa allo zero deve essere, inoltre, minore di uno. Il numero massimo di valutazioni deve essere maggiore o uguale a due. I valori iniziali non devono essere uguali.

Bibliografia: [1], [2], [3], [5]
Parametri di I/O: input

f - funzione reale, funzione di cui calcolare lo zero
x1 - reale, valore iniziale
x2 - reale, valore iniziale
tolx - reale, tolleranza relativa allo zero
tolf - reale, tolleranza assoluta per la funzione
nmax - intero, numero massimo di valutazioni

output

z - reale, zero della funzione
fz - reale, valore della funzione (residuo)
nval - intero, numero di valutazioni occorse
ifail - intero, indicatore d'errore

Indicatori d'errore: Errori gestiti dalla subroutine:
ifail = 0 nessun errore.
ifail = 1 la tolleranza inserita per lo zero è negativa o maggiore di uno
ifail = 2 la tolleranza assoluta inserita è negativa
ifail = 16 il numero di valutazioni richiesto è negativo
ifail = 19 il numero massimo di valutazioni consentito è stato raggiunto
ifail = 22 i valori iniziali x1, x2 inseriti sono uguali
Routines ausiliarie: tolm, funzione reale, tolleranza minima.
Tempo d'esecuzione: funzione della tolleranza e del numero massimo di valutazioni richiesti.
Memoria richiesta: nessun array allocato in memoria.
Accuratezza fornita: dipendente dalla tolleranza immessa dall'utente e dalla funzione che si prende in esame.
Esempio di programma chiamante:
      Program secd
      
c     Programma dimostrativo della subroutine sec

      external sec
      
      real f1,f2, f10, f11
      external f1,f2, f10, f11
         
      integer n, nmax, ifail
      real x1, x2, tolx,tolf   
      character risp
      
      print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE SEC ***'
   10 continue
         print*
         print*,'Funzione :'
         print*
         print*,'1) sin(x)'
         print*
         print*,'2) (100/x**2)*sin(10/x)'
         print*
         print*,'3) x^2 -1'
         print*
         print*,'4) log(x)'
         print*
         print*,'Numero della funzione= '
         read(*,*)n                                       
         print*,'Valori di partenza (x1, x2)= '
         read(*,*)x1,x2
         print*,'Tolleranza relativa per lo zero= '
         read(*,*)tolx
         print*,'Tolleranza assoluta per il valore della funzione= '
         read(*,*)tolf
         print*,'Numero massimo di valutazioni= '
         read(*,*)nmax
         if (n .eq. 1)
     %      call sec(f1,x1,x2,tolx,tolf,nmax,z,fz,nval,ifail)
         if (n .eq. 2) 
     %      call sec(f2,x1,x2,tolx,tolf,nmax,z,fz,nval,ifail)
         if (n .eq. 3) 
     %      call sec(f10,x1,x2,tolx,tolf,nmax,z,fz,nval,ifail)         
         if (n .eq. 4) 
     %      call sec(f11,x1,x2,tolx,tolf,nmax,z,fz,nval,ifail)              

         if (ifail .eq. 1)
     %      print*,'Errore! tolleranza relativa non valida '
         if (ifail .eq. 2)
     %      print*,'Errore! tolleranza assoluta non valida '
         if (ifail .eq. 16)
     %      print*,'Errore! numero di valutazioni non valido '
         if (ifail .eq. 22)
     %      print*,'Errore! valori iniziali uguali '
         if (ifail .ne. 19) then 
            goto 20
         else          
            print*,'Attenzione! calcolo interrotto per raggiungimento'
            print*,'del numero massimo di valutazioni'
         endif               
   20    print*  
         write(*,30)'Stima dello zero = ',z
         print*
         write(*,30)'Valore della funzione = ',fz
         print*
         write(*,40)'Valutazioni effettuate = ',nval
         print*
         print*,'c per continuare, un altro carattere per terminare:'
         read(*,'(A)')risp
      if (risp .eq. 'c') goto 10

   30 format(1X,A,E14.7)
   40 format(1X,A,I6)                
      
      End
	



Precedente Indice Successivo