Precedente | Indice | Successivo |
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 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 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 |