Calcul formel : Mode d'emploi - Exemples en Maple
Claude Gomez, Bruno Salvy, Paul Zimmermann
Masson, 1995
Chapitre VIII, section 3.8, exercice 1, page 224.
Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/
|
|
Nous savons bien que la base des logarithmes népériens est somme de la série de terme général 1/k!. Quand nous effectuons la multiplication de la somme de cette série par n! les termes d'indice k=0 à k=n donnent un entier. Multiplié par 2*Pi, cet entier disparaît dans le sinus. L'expression utile est donc le sinus de 2*Pi fois la somme des 1/(n+1)/(n+2)../(n+k). Si nous tronquons cette somme au rang k=m, le reste est classiquement majoré par n!/((n+m).(n+m)!). Il fournit donc un O(1/n^(m+1)). Le calcul à effectuer est donc le suivant, pour un m donné.
> m:=15;
> da:=asympt(sin(2*Pi*add(1/mul(n+j,j=1..i),i=1..m)+O(1)/n^(m+1)),
n,m+1);
Tester numériquement cette approximation demande une grande précision de calcul. En effet n! est rapidement très grand et pourtant 2*Pi*e*n! doit être bien déterminé par rapport aux multiples de 2*Pi pour que le sinus soit calculé correctement. En conséquence nous lions la valeur de Digits à la longueur de l'écriture décimale de n!.
> nn:=30;
> Digits:=floor(1.5*length(nn!));
> truevalue:=evalf(sin(2*Pi*exp(1)*nn!));
> approximation:=evalf(eval(subs(O=0,n=nn,da)));
> evalf(truevalue-approximation);
On peut être déçu de la mauvaise qualité de l'approximation. En effet on attendait une erreur de l'ordre de 1/n^m.
> evalf(1/nn^m,3);
Ce n'est pas du tout ce que l'on observe et cela est dû au fait que les coefficients du développement croissent très vite.
> evalf(da,3);