Precedente | Indice | Successivo |
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 output
z - reale, zero della funzione |
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 |