Calcul formel : Mode d'emploi - Exemples en Maple
Claude Gomez, Bruno Salvy, Paul Zimmermann
Masson, 1995
Chapitre II, section 1.4, exercice 1, page 45.
Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/
|
|
Une boucle fait l'affaire. On notera le point décimal du 1. qui apparaît dans la définition de term à la deuxième ligne. Sans ce point le calcul effectué serait exact et fournirait un rationnel. Il serait beaucoup plus coûteux, ce qui est absurde puisque l'on désire un résultat en flottants.
> s:=1:
term:=1.:
bound:=10.^(-Digits-2):
for n while term>bound do
term:=term/n;
s:=s+term
od:
s;
À partir de V.4, on pourrait aussi utiliser add (qui comporte une boucle dans son code) mais cela suppose de déterminer préalablement jusqu'où il faut sommer les termes.
D'ailleurs il faudrait justifier le choix qui a été fait ci-dessus pour contrôler la boucle. Il repose sur l'estimation grossière suivante, qui est suffisante vue la rapide convergence de la série : si le terme d'indice N+1 est plus petit que beta alors le reste d'indice N de la série est majoré par beta*sum(1/2^k,k=0..infinity), c'est-à-dire 2*beta. Ici nous avons pris beta égal à 10.^(-Digits-2). Du coup on peut se demander pourquoi on n'obtient pas la valeur attendue. Il aurait fallu pour cela modifier la valeur de Digits. Ici tous les calculs ont été effectués avec dix chiffres décimaux et ce sont les erreurs d'arrondi qui font que le résultat est incorrect. Il faudrait donc reprendre le calcul en commençant par l'instruction suivante.
> Digits:=12: