Scrivere un programma che integri la funzione x4 tra 0
e 1 mediante due sottoprogrammi (uno di tipo function e uno subroutine) che
implementino rispettivamente la formula trapezoidale e quella di Simpson .
La funzione integranda deve essere calcolata in una function
di un argomento real il cui nome sarà passato come argomento
alla procedura che valuta l' integrale. Una procedura
Fortran (subroutine o function) può avere tra i
suoi
argomenti il nome di un'altra procedura. Questo argomento va dichiarato nel
sottoprogramma mediante un' interfaccia esplicita(*).
Verificare
l' accuratezza del risultato in funzione del numero di punti, e della
precisione dei real, partendo
da una decina di punti fino a qualche milione. Si
ricorda che la formula trapezoidale (estesa) corrisponde a sommare i valori
della funzione su punti equispaziati, a distanza h, attribuendo a
ciascuno un peso h,
tranne gli estremi che intervengono con peso h/2. La formula di
Simpson
(estesa) fa invece intervenire pesi
h/3,4h/3,2h/3,4h/3,2h/3,...,4h/3,h/3 e
quindi
presuppone un numero dispari di punti (ovvero un numero pari di intervallini). In
particolare
andrà verificata la dipendenza dell' accuratezza
dell' integrale dal numero di punti. Si ricorda che l'
errore algoritmico del metodo trapezoidale va a zero con 1/N2,
mentre
nel
caso
Cavalieri-Simpson
la
dipendenza
è
1/N4, per funzioni con derivata seconda e quarta limitata, rispettivamente.
(*) Esempio:
module prec
integer, parameter :: rk= selected_real_kind(6)
end module prec
module funzi
use prec
implicit none
contains
function f(fun,a,b) result (r)
real(kind=rk),intent(in) :: a,b
real(kind=rk) :: r
interface
function fun(x) result(res)
use prec
real(kind=rk), intent(in) :: x
real(kind=rk) :: res
end function fun
end interface
.....
end function f
function fun1(x) result(r1)
...
end function fun1
function fun2(x) result(r1)
...
end function fun2
end module funzi
program pippo
use funzi
implicit none
real(kind=rk) :: q,s,a,b
...
q=f(fun1,a,b)
s=f(fun2,a,b)
...
dove fun1 e fun2 sono funzioni con la stessa interfaccia di fun.