Calcul formel : Mode d'emploi - Exemples en Maple
Claude Gomez, Bruno Salvy, Paul Zimmermann
Masson, 1995
Chapitre VIII, section 2.7, exercice 8, page 212.
Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/
|
|
Théorie. On peut difficilement imaginer un exercice plus truqué. Dans la théorie des séries de Fourier, la preuve du théorème de Dirichlet emploie le noyau de Dirichlet. Il est défini par la formule
ce qui donne
La première expression montre clairement que l'intégrale du noyau de Dirichlet sur un intervalle de longueur 2*Pi vaut Pi. Ensuite la théorie fait considérer le noyau de Fejér qui s'obtient par la moyenne de Cesàro à partir du noyau de Dirichlet
Le noyau de Fejér s'exprime encore par la formule.
Puisqu'on applique simplement une moyenne, la valeur de l'intégrale du noyau de Fejér sur un intervalle de longueur 2*Pi vaut Pi. Si l'on regarde l'intégrale proposée dans l'exercice, on constate que l'on est exactement en train de calculer cette intégrale du noyau de Fejér. La translation par alpha, la translation par x et la symétrie sont des illusions et ces paramètres ne servent en fait à rien. La réponse attendue est donc Pi. Comme on va le voir, elle ne va être obtenue que par un effort certain. Cet exercice montre bien qu'il vaut mieux disposer d'un peu de culture que d'un système de calcul formel.
Pratique. Pour mener le calcul, nous définissons le terme générique et nous l'exprimons avec des exponentielles, plus adéquates que les fonctions trigonométriques (car les expressions sont rationnelles en les exponentielles).
> un:=(sin(n*theta)/sin(theta))^2/n;
> un:=convert(readlib(`combine/trig`)(un),exp);
Ensuite il faut coder le fait que n est une entier. On peut évidemment penser à employer assume. Mais ce procédé est fondé sur un bricolage tartiné sur du calcul formel et n'est pas correctement pris en compte par toutes les procédures. Plutôt que cette astuce de gagne-petit, nous préférons employer une idée qui ressortit vraiment au calcul formel : pour coder le fait qu'une variable est entière nous employons une série génératrice. Autrement dit pour manipuler la suite (u_n) nous passons par la série formelle sum(u_n*z^n,n=0..infinity).
> gf:=sum(expand(un*z^n),n=1..infinity);
> gf:=evalc(gf);
Il reste quelques cos^2+sin^2 donc une application de combine/trig s'impose.
> gf:=combine(gf,trig);
Si nous pensons que les indéterminées z et theta représentent des variables réelles, il est clair que la partie imaginaire doit être nulle, donc nous ne conservons que la partie réelle.
> gf:=evalc(Re(gf));
Dans la question on emploie la variable t et ici nous employons la variable theta. Les deux sont liées par la relation theta=(x-t)/2, donc il faut faire varier theta dans un intervalle de longueur Pi. Cependant l'intégrande f(theta) satisfait, pour tout theta, f(-theta)=f(theta) et f(Pi+theta)=f(theta). Elle est donc périodique paire et l'intégrale cherchée est le double de l'intégrale de 0 à Pi/2. Ainsi l'intégrale est indépendante d'alpha et x, comme nous l'avions remarqué au début (mais nous ne voulons pas nous appuyer sur le noyau de Fejér et c'est pourquoi nous donnons une preuve indépendante). Nous tentons donc de calculer cette intégrale.
> int(gf,theta=0..Pi/2);
La présence des valeurs absolues perturbe le système et nous nous débarassons de celles-ci en considérant que l'indéterminée z représente un réel strictement compris entre 0 et 1.
> gf:=eval(subs(z-1=1-z,abs=(expr->expr),gf));
> int(gf,theta=0..Pi/2);
Cela nous avance guère et, pleins d'espoir, nous poussons le système dans la voie de la vérité en employant une intégration par parties.
> hope:=student[intparts](%,numer(op(1,%)));
> op([2,1],hope);
Comme combine/trig n'a pas l'effet escompté, nous arrangeons l'expression à la main pour faire disparaître l'apparente singularité en Pi/2.
> integrand:=-subs(sin(2*theta)=2*sin(theta)*cos(theta),
tan(theta)=sin(theta)/cos(theta),op([2,1],hope));
Notre espoir d'arriver au bout de ce calcul grandit.
> Hope:=int(integrand,op([2,2],hope));
Il est clair qu'il faut appliquer simplify/radical pour améliorer cette écriture. Nous passons en paramètre l'option symbolic faute de quoi l'interprétation usuelle des indéterminées par des variables complexes empêcherait toute transformation.
> simplify(Hope,radical,symbolic);
Nous voyons poindre des racines carrées de z. Comme nous n'aimons rien tant que les expressions rationnelles, nous procédons à un changement de variables pour éliminer cette racine carrée.
> glory:=simplify(subs(z=Z^2,Hope),radical,symbolic);
> collect(glory,arctan,normal);
Nous n'allons pas être volontairement aveugles. Notre Z se promène dans l'intervalle ouvert ]0,1[, du moins c'est ainsi que nous l'interprétons. Or pour x strictement négatif, nous avons Arctg(x)+Arctg(1/x)=-Pi/2. Nous modifions en conséquence et à la main l'expression ci-dessus.
> eval(subs(arctan=(expr->-Pi/4),%));
Nous n'oublions pas que nous calculions la moitié de l'intégrale cherchée.
> Glory:=2*normal(%,expanded);
> Glory:=normal(subs(Z^2=z,Glory));
La conclusion s'impose : la suite des intégrales est constante de valeur Pi.
On pourrait aussi imaginer de chercher une récurrence linéaire à coefficients rationnels en n satisfait par la suite u_n, ce qui fournirait une équation différentielle à coefficients rationnels satisfaite par la série génératrice. Pour passer de l'une à l'autre on employerait gfun. Ceci éviterait les problèmes d'interprétation des indéterminées comme des variables réelles.