Calcul formel : Mode d'emploi - Exemples en Maple
Claude Gomez, Bruno Salvy, Paul Zimmermann
Masson, 1995
Chapitre IX, section 3.3, exercice 4, page 254.
Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/
|
|
Nous employons conjointement les versions V.3 et V.5 pour mettre en valeur quelques différences.
On peut représenter la suite de fonctions par une procédure. Notez que l'on tient compte du cas formel (#).
> f:=proc(n,x)
if not type([n,x],[integer,numeric]) then 'f(n,x)' #
elif x<=1/(2*n) then 2*n^2*x
elif x<=1/n then 2*n*(1-n*x)
else 0 fi
end:
Ensuite on trace quelques graphes. La syntaxe peut paraître compliquée. Notons d'abord que la flèche -> permet de définir une procédure et l'emploi de cette procédure dispense d'indiquer le nom de la variable pour spécifier l'intervalle d'intégration.
> plot({seq(subs(n=k,x->f(n,x)),k=1..10)},0..1,color=red);
Ensuite on peut se demander pourquoi on utilise un subs. L'instruction suivante fournit la séquence cherchée sans mystère.
> seq(f(n,x),n=1..2);
Cependant elle a, en Maple V.3, un effet de bord. Le nom n est passé du statut de symbole à celui de variable, car il intervient comme compteur dans la boucle sous-jacente au seq. L'emploi du nom k, qui désigne une variable, permet d'éviter ce changement de statut.
> n;
En Maple V.5, le problème ne se pose pas (ceci est valable depuis la version V.4).
> f:=proc(n,x)
if not type([n,x],[integer,numeric]) then 'f(n,x)'
elif x<=1/(2*n) then 2*n^2*x
elif x<=1/n then 2*n*(1-n*x)
else 0 fi
end:
> plot({seq(f(n,x),n=1..10)},x=0..1,color=red);
> n;
En Maple V.3, comme en Maple V.5, on pourrait aussi employer piecewise pour tracer les graphes.
> F:=piecewise(x<=1/(2*n),2*n^2*x,x<=1/n,2*n*(1-n*x),0);
> plot({seq(F,n=1..10)},x=0..1,color=red);
Bien sûr en V.3, la remarque sur l'emploi du subs est toujours valable.
> F:=piecewise(x<=1/(2*n),2*n^2*x,x<=1/n,2*n*(1-n*x),0);
> plot({seq(subs(n=k,F),k=1..10)},x=0..1,color=red);
Pour ce qui est du calcul d'intégrales, la bonne méthode est de dissocier à la main les différents cas.
> ifn:=int(2*n^2*x,x=0..1/(2*n))+int(2*n*(1-n*x),x=1/(2*n)..1/n);
Un calcul fondé sur l'emploi d'une expression de type piecewise ou d'une procédure est voué à l'échec parce que le caractère entier de n n'est pas spécifié.
> iFn:=int(F,x=0..1);
> int(f(n,x),x=0..1);
Pour la même raison, le calcul de l'intégrale de la fonction limite est inaccessible. Cependant il est clair que la fonction limite est la fonction nulle. Comme dans l'exemple traité, la convergence n'est pas uniforme.