Calcul formel : Mode d'emploi - Exemples en Maple
Claude Gomez, Bruno Salvy, Paul Zimmermann
Masson, 1995
Chapitre II, section 3.4, exercice 5, page 74.
Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/
|
|
Comme dans l'exercice précédent, il suffit de recopier le code fourni dans le texte. Cependant le code de la page 72 comporte une petite erreur que nous corrigeons à la ligne marquée d'un dièse. Signalons que l'aide sur l'opérateur de concaténation qu'est le point s'obtient par ?. jusqu'en V.3 et par ?dot pour V.3, V.4, V.5.
> lndiff:=proc(f,x)
local i,fct;
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
fct:=`lndiff/`.(op(0,f)); #
if not type(fct,procedure) then traperror(readlib(fct)) fi;
if not type(fct,procedure) then
ERROR("not yet implemented",args)
else fct(op(f),x)
fi
else ERROR("arguments do not match the definition",args)
fi
end:
Ensuite nous étendons lndiff aux fonctions de notre choix. Par exemple la première procédure ci-dessous donne la dérivée logarithmique de f=exp(g).
> `lndiff/exp`:=proc(g,x)
diff(g,x)
end:
`lndiff/ln`:=proc(g,x)
diff(g,x)/g/ln(g)
end:
`lndiff/sin`:=proc(g,x)
diff(g,x)*cot(g)
end:
`lndiff/cos`:=proc(g,x)
diff(g,x)*tan(g)
end:
> 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);
Error, (in lndiff) not yet implemented, tan(x), x