25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

306 Unità di Programma<br />

END FUNCTION complex_to_polar<br />

END PROGRAM convert<br />

Si vuole concludere il capitolo con esempio di programma abbastanza ”completo” e che<br />

riassuma buona parte dei concetti descritti nelle pagine precedenti. <strong>Il</strong> codice che segue è, in<br />

un certo senso, una riscrittura del programma già proposto in precedenza per il calcolo della<br />

radice di una funzione con il metodo di Newton-Raphson. In questo caso, oltre a modificare<br />

l’algoritmo per rendere ricorsiva l’esecuzione della routine, si prevede anche la possibilità che la<br />

derivata della funzione argomento non sia disponibile. In questo caso, non potendosi applicare<br />

direttamente la formula iterativa<br />

xi+1 = xi + f(xi)<br />

f ′ (xi)<br />

si dovrà ricorrere al cosiddetto metodo delle secanti il quale discretizza la derivata f ′ (x) secondo<br />

la relazione:<br />

f ′ f(b) − f(a)<br />

(c) =<br />

b − a<br />

in cui a e b rappresentano gli estremi di un intervallo per il quale passa la generica retta secante<br />

la funzione, mentre il termine c rappresenta l’intersezione della retta secante passante per i<br />

punti (a, f(a)) e (b, f(b)) con l’asse delle ascisse. Così come per il metodo di Newton-Raphson,<br />

la successione dei valori assunti da c secondo la formula iterativa:<br />

<br />

b − a<br />

c = a − f(a) ×<br />

f(b) − f(a)<br />

converge, entro una certa ammissibile tolleranza, alla radice della funzione nell’intervallo specificato.<br />

MODULE RootFinders<br />

! Massimo errore consentito nell’individuazione della radice<br />

REAL,PARAMETER :: default_tolerance = EPSILON(1.0)<br />

! Restringe la visibilita’ delle funzioni di modulo...<br />

PRIVATE secant, newton<br />

! ... per cui secant e newton potranno essere invocate<br />

! soltanto all’interno del modulo<br />

CONTAINS<br />

! Usa il metodo delle secanti per trovare una radice di f se df,<br />

! la derivata di f, non e’ disponibile, altrimenti, usa il metodo<br />

! di Newton. Gli estremi "a" e "b" sono usati come intervallo di<br />

! partenza used dal metodo delle secanti. La media aritmetica di<br />

! "a" e "b" è usata come punto iniziale dal metodo di Newton<br />

FUNCTION findRoot(a,b,f,df,tolerance)<br />

! *** Sezione dichiarativa ***<br />

IMPLICIT NONE<br />

! Tipo della funzione<br />

REAL :: findRoot

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!