Calcul formel : Mode d'emploi - Exemples en Maple
Claude Gomez, Bruno Salvy, Paul Zimmermann
Masson, 1995
Chapitre II, section 3.4, exercice 4, page 74.
Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/
|
|
L'énoncé demande de définir la dérivée logarithmique sans passer par diff. Cela ne signifie pas que l'on n'emploie pas diff, mais simplement que l'on utilise au mieux les formules comme (uv)'/(uv)=u'/u+v'/v. On se contente de transposer la procédure des pages 70-71. En Maple V.3, on employerait convert/+ appliqué à une liste et non add. De plus les messages d'erreur seraient encadrés d'accents graves et non de guillemets, qui servent à délimiter les chaînes de caractères depuis la version V.5.
> lndiff:=proc(f,x)
local i;
if not has(f,x) then 0
elif f=x then 1/x
elif type(f,`+`) then diff(f,x)/f
elif type(f,`*`) then
add(lndiff(op(i,f),x),i=1..nops(f))
elif type(f,`^`) then
if not has(op(2,f),x) then op(2,f)*lndiff(op(1,f),x)
else lndiff(exp(op(2,f)*ln(op(1,f))),x)
fi
elif type(f,function) then
if op(0,f)=exp then diff(op(1,f),x)
elif op(0,f)=ln then diff(op(1,f),x)/op(1,f)/f
elif op(0,f)=sin then diff(op(1,f),x)*cot(op(1,f))
elif op(0,f)=cos then diff(op(1,f),x)*tan(op(1,f))
elif op(0,f)=tan then lndiff(sin(op(1,f))/cos(op(1,f)),x)
elif op(0,f)=GAMMA and nops(f)=1 then Psi(op(1,f))
else ERROR("this case has not been implemented",args)
fi
else ERROR("arguments do not match the definition",args)
fi
end:
Le cas des fonctions peut être étendu à volonté, mais, comme il est expliqué page 71, ceci n'est pas la bonne manière de procéder. La question est reprise à l'exercice suivant.
Par ailleurs, nous testons le code que nous venons d'écrire sur quelques exemples simples.
> f:=(x^3+1)/(x-1);
> lndiff(f,x);
> f:=exp(x^2+x);
> lndiff(f,x);
> f:=ln((x^3+1)/(x-1));
> lndiff(f,x);
> f:=tan(x);
> lndiff(f,x);
> f:=GAMMA(2,exp(x));
> lndiff(f,x);
> trace(lndiff):
> lndiff(1/cos(x),x);
{--> enter lndiff, args = 1/cos(x), x
{--> enter lndiff, args = cos(x), x
<-- exit lndiff (now in lndiff) = tan(x)}
<-- exit lndiff (now at top level) = -tan(x)}
> untrace(lndiff):