quanc8
. Nous mettrons en
évidence les principales variables qui interviennent lors d'une
intégration par pas variables.
Nous aurons besoin des routines suivantes:
Voici le Makefile à utiliser avec le gfortran (le programme principal doit s'appeler Integration.f90).
subroutine
quanc8(fun,a,b,abserr,relerr,result,errest,nofun,flag)
Etant donnée une fonction fun(x)
, les bornes
d'intégration a
et b
, la routine renvoie
la valeur result
de l'integrale de cette fonction entre les
deux bornes, errest
une estimation de l'erreur absolue sur
la valeur de l'intégrale, nofun
le nombre
d'évaluations qu'elle a effectuées ainsi que
flag
qui indique la fiabilité du résultat (si
flag
est nul, c'est que le résultat est fiable).
L'utilisateur doit fournir abserr
et relerr
qui
sont respectivement les erreurs absolues et relatives qu'il souhaite.
La sous-routine quanc8
fonctionne en double
précision. Tout le programme sera donc écrit en double
précision (r
=8 et DP
).
L'interface de quanc8
est contenue dans le module
forsythe
. Le programme principal y fait donc
référence par
use forsythe, only: quanc8
.
La fonction fun(x)
doit être construite
explicitement et son interface introduite dans list_interface
.
Soit la fonction fun(x) = 1/((x-0.3)**2+0.01) + 1/((x-0.9)**2+0.04) - 6. Nous allons l'intégrer sur l'intervalle [0,1].
relerr=0.
et
abserr=0.
Affichez le résultat, l'erreur absolue
sur ce résultat ainsi que le nombre d'évaluations de la fonction.
abserr = 0.
; relerr = 10._r**(-i)
)
relerr = 0.
; abserr = 10._r**(-i)
)
i
de 1 à 16. Vous afficherez les valeurs de i
,
result
, errest
et nofun
.
fun(x)
afin de visualiser à
quelles valeurs la fonction est évaluée. Il suffit
pour cela d'ouvrir un fichier avant l'appel à quanc8
,
d'y écrire les valeurs de x
et fun
à partir de la fonction
fun(x)
, et de refermer le fichier après
l'intégration.
Tracez un graphe de ces points pour abserr = 0.
et
relerr = 1.E-4_r, 1.E-9_r et 1.E-14_r
.
Vous devez inclure ce fichier dans votre projet et faire use IntegrationPack
dans les parties de votre programme qui utiliseront les routines de ce module.
Pour intégrer une fonction fun(x)
entre a
et b
par la formule des trapèzes, il suffit de faire
result = Trapeze (fun, a, b, n)
où n
est le nombre de points utilisés pour l'application de cette formule (pas h donné par (b-a)/n).
Vous pouvez également faire
result = Simpson (fun, a, b, n)
result = Bode (fun, a, b, n)
result = Bart (fun, a, b, n)
result = Lisa (fun, a, b, n)
result = Maggie (fun, a, b, n)
pour utiliser respectivement les formules de Simpson, Bode, Bart, Lisa et Maggie. Notez bien que ces différentes formules ont des contraintes quant aux valeurs permises pour n
.
La fonction suivante
result = Integration (fun, a, b, n)
appliquera de manière optimale une combinaison des formules des trapèzes, de Simpson, de Bode, de Bart, de Lisa et de Maggie suivant la valeur de n
(toute valeur est permise).
Finalement la fonction suivante implémentera la méthode de Gauss :
result = Gauss (fun, a, b, n)
Cette fonction se base sur la routine gauleg
du Numerical Recipes qui est également incluse dans ce module.
Cet exercice illustre surtout l'utilisation de procédures de modules. Il s'agit d'une manière élégante de programmer (l'interfaçage est réduit à sa plus simple expression). Cet exercice illustre également l'écriture de fonctions pour lesquelles un des arguments est lui-même une fonction. Le nom particulier donné à cette fonction lors de l'utilisation de ces procédures n'a aucune importance (cette fonction est désignée par fun(x)
dans ces explications; elle est désignée par f(x)
dans le module).
La routine quanc8
est plus efficace que les méthodes implémentées dans ce module. La méthode de Gauss fournit également des résultats très précis pour un nombre réduit de points. Ces méthodes imposent cependant les points pour lesquels la fonction à intégrer doit être évaluée. Les méthodes implémentées dans ce module gardent leur intérêt dans des situations où les points pour lesquel la fonction à intégrer est connue sont répartis suivant un pas régulier.