Calcul formel : Mode d'emploi - Exemples en Maple
Claude Gomez, Bruno Salvy, Paul Zimmermann
Masson, 1995
Chapitre I, section 2.7, exercice 8, page 32.
Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/
|
|
Dans la version V.3 (qui a servi pour l'écriture du manuel) la résolution se déroule très simplement.
> sys:={x*y=a^2,ln(x)^2+ln(y)^2=5/2*ln(a)^2}:
inc:={x,y}:
> solve(sys,inc);
Depuis la version V.4, le progrès a fait rage.
> sys:={x*y=a^2,ln(x)^2+ln(y)^2=5/2*ln(a)^2}:
inc:={x,y}:
> S1:=solve(sys,inc);
On peut tenter de simplifier l'expression, mais cela ne change pas grand'chose à l'affaire.
> S2:=map(simplify,S1,ln,symbolic);
Le résultat est un peu déroutant. On pourrait penser utiliser convert/radical, mais cette procédure opère des choix de branches pour les radicaux et on perd des solutions.
> convert(S,radical);
> map(simplify,",ln,symbolic);
> map(simplify,",power,symbolic);
À l'inverse, la procédure allvalues remplace les RootOfs de toutes les façons possibles et sans soin. Si un même RootOf apparaît plusieurs fois, disons k fois, dans une expression et peut prendre n valeurs alors on obtient k*n valeurs et non n comme on est en droit de s'y attendre. Ici RootOf(2*ln(a^2)^2-2*ln(a^2)*_Z+_Z^2-5*ln(a)^2) apparaît deux fois et représente deux valeurs :
> X:={allvalues(RootOf(3*ln(a)^2-4*ln(a)*_Z+_Z^2))};
L'emploi de allvalues va donc fournir quatre valeurs et non deux. D'autre part l'autre RootOf correspond à une extraction de racine carrée et donne donc deux valeurs. On va donc obtenir huit couples au lieu de deux.
> S4:={allvalues(S2)};
Il ne reste plus alors qu'à opérer un tri pour ne conserver que les solutions du problème.
> select(proc(s,sys)
evalb(convert(
simplify(eval(subs(s,sys)),ln,symbolic),
`and`))
end,S4,sys);
Ceci n'est guère satisfaisant. Revenons à de sains principes. Un système de calcul formel a comme domaine de prédilection les polynômes et les fractions rationnelles. C'est là qu'il excelle. Le système proposé est polynomial en ln(x) et ln(y). Ceci est un point de départ solide qui nous fournit une méthode de résolution.
> sys2:={X^2+Y^2-5/2*A^2,X+Y-2*A};
> ss:=[solve(sys2,{X,Y})];
> subs({X=ln(x),Y=ln(y),A=ln(a)},ss);
> map(solve,",{x,y});