Precedente Indice Successivo



Fzero



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

Il problema riguarda la risoluzione di una equazione f(x) = 0 in un intervallo compatto negli estremi del quale la funzione f assuma valori di segno opposto.

Descrizione dell'algoritmo

La soluzione è ottenuta mediante l'algoritmo di Dekker-Brent che è la combinazione del metodo di bisezione e di quello delle secanti (si tratta quindi di un metodo ibrido). La strategia adottata è quella di costruire le condizioni per adottare il metodo delle secanti, preferito per le sue doti di convergenza, quando tali condizioni mancano il metodo applica la bisezione, che in quanto globale garantisce un campo applicativo più vasto.

Raccomandazioni sull'uso

La funzione deve avere segno discorde agli estremi. Entrambe le tolleranze relative devono essere positive mentre quella relativa allo zero deve essere anche minore di uno. Il numero massimo di valutazioni deve essere maggiore o uguale a due.

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

f - funzione reale, funzione di cui calcolare lo zero
a - reale, estremo inferiore dell'intervallo contenente lo zero
b - reale, estremo superiore dell'intervallo contenente lo zero
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 la funzione di cui calcolare lo zero ha valori concordi negli estremi dell'intervallo o gli estremi 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 fzerod

c     Programma dimostrativo della subroutine fzero

      external fzero

      real f1,f2, f10, f11
      external f1,f2, f10, f11

      integer n,nmax,ifail
      real a,b,tolx,tolf
      character risp

      print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE FZERO ***'
   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*,'Estremi dell''intervallo contenente lo zero= '
      read(*,*)a,b
      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 fzero(f1,a,b,tolx,tolf,nmax,z,fz,nval,ifail)
      if (n .eq. 2)
	 % call fzero(f2,a,b,tolx,tolf,nmax,z,fz,nval,ifail)
      if (n .eq. 3)
	 % call fzero(f10,a,b,tolx,tolf,nmax,z,fz,nval,ifail)
      if (n .eq. 4)
	 % call fzero(f11,a,b,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 concordi negli estremi'
      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