Calcul formel : Mode d'emploi - Exemples en Maple

Claude Gomez, Bruno Salvy, Paul Zimmermann

Masson, 1995

Chapitre VI, section 2.3, exercice 5, page 167.

Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/

Page du Projet Algorithmes | Page de Philippe Dumas | Page Maple de Philippe Dumas

Retour en page principale
Table des matières
Index
Maple V.3 worksheet
Maple V.4 worksheet
Maple V.5 worksheet


Calcul en Maple V.3 | Calcul en Maple V.5
Interprétation | Reprise
Paramétrage

Calcul en Maple V.3. Nous traduisons les conditions imposées en un système. Il n'y a pas de perte de généralité à supposer que le cercle est de rayon 1 et que son centre est l'origine du repère utilisé. De plus on peut orienter le repère pour que la droite soit verticale, d'équation x=d. Il faut écrire que

Pour chaque point M, nous notons x[m] et y[m] son abscisse et son ordonnée. Nous écrivons tout cela en Maple V.3.

> sys:={x[p]-d,
x[a]^2+y[a]^2-1,x[b]^2+y[b]^2-1,
(x[p]-x[a])*x[a]+(y[p]-y[a])*y[a],
(x[p]-x[b])*x[b]+(y[p]-y[b])*y[b],
3*x[g]-x[p]-x[a]-x[b],3*y[g]-y[p]-y[a]-y[b]};

[Maple Math]
[Maple Math]

Nous voulons éliminer les variables autres que l'abscisse et l'ordonnée de G. Nous employons donc l'ordre purement lexicographique en mettant ces deux variables en dernier.

> gb:=grobner[gbasis](sys,
[x[p],y[p],x[a],y[a],x[b],y[b],x[g],y[g]],
plex);

Le temps de calcul est important (plusieurs heures) ; la mémoire utilisée n'est pas trop importante ; le résultat a une grande taille et c'est pourquoi nous ne l'écrivons pas.

L'emploi de l'ordre purement lexicographique signifie que l'on triangule le système. C'est ce que nous mettons en valeur ci-dessous, en construisant une matrice dont chaque ligne est associée à un polynôme de la base et chaque colonne à une indéterminée. Le coefficient d'indice (i,j) vaut 1 si et seulement si le polynôme d'indice i comporte l'indéterminé d'indice j.

> varlist:=[x[p],y[p],x[a],y[a],x[b],y[b],x[g],y[g]]:

> G:=array(1..nops(gb),1..nops(varlist),sparse):
for i to nops(gb) do
for j to nops(varlist) do
if has(gb[i],varlist[j]) then G[i,j]:=1 fi
od
od:
print(G);

[Maple Math]

Calcul en Maple V.5. Le calcul précédent est extrèmement coûteux alors que nous n'avons pas besoin de toute cette information. Seul un des polynômes obtenus nous intéresse. Nous passons donc en V.5 où les ordres proposés sont plus variés. L'ordre qui convient à l'élimination est lexdeg.

> sys:={x[p]-d,
x[a]^2+y[a]^2-1,x[b]^2+y[b]^2-1,
(x[p]-x[a])*x[a]+(y[p]-y[a])*y[a],
(x[p]-x[b])*x[b]+(y[p]-y[b])*y[b],
3*x[g]-x[p]-x[a]-x[b],3*y[g]-y[p]-y[a]-y[b]};

[Maple Math]
[Maple Math]

> gb:=Groebner[gbasis](sys,
lexdeg([x[p],y[p],x[a],y[a],x[b],y[b]],[x[g],y[g]]));

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

Regardons maintenant la forme du système obtenu, toujours par le même procédé.

> varlist:=[x[p],y[p],x[a],y[a],x[b],y[b],x[g],y[g]];

[Maple Math]

> G:=array(1..nops(gb),1..nops(varlist),sparse):
for i to nops(gb) do
for j to nops(varlist) do
if has(gb[i],varlist[j]) then G[i,j]:=1 fi
od
od:
print(G);

[Maple Math]

Nous voyons qu'il y a exactement une équation en l'abscisse et l'ordonnée de G, les autres utilisant globalement toutes les indéterminées. C'est la raison pour laquelle le calcul est moins coûteux qu'avec plex.

Interprétation. Intéressons nous maintenant à l'équation qui décrit le lieu de G.

> equ:=remove(has,gb,{p,a,b}):

> nops(equ);

[Maple Math]

> equ:=equ[1];

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

> degree(equ,x[g]);

[Maple Math]

> degree(equ,y[g]);

[Maple Math]

Cette équation est de degré 7 en l'abscisse de G et de degré 4 en l'ordonnée de G. Ceci est un peu troublant car nous ne sommes pas habitués à considérer des courbes de degré aussi elevé. Essayons d'avoir le regard plus perçant.

> equ:=factor(equ);

[Maple Math]
[Maple Math]

> map(proc(z) degree(z,{x[g],y[g]}) end,
convert(equ,list));

[Maple Math]

Il s'avère que la courbe se décompose en une cubique et une quartique.

> Equ[1]:=select(proc(z) degree(z,{x[g],y[g]})=3 end,equ);

[Maple Math]

> Equ[2]:=select(proc(z) degree(z,{x[g],y[g]})=4 end,equ);

[Maple Math]
[Maple Math]

Le fait que la courbe se décompose est louche et mérite réflexion. En fait nous n'avons pas été assez soigneux et nous n'avons pas tenu compte de la remarque de la page 166 sur les cas de dégénérescence. En effet il est implicite que les points de contact A et B sont distincts et nous n'avons pas explicité cette condition. Nous procédons donc comme à la page 160 en introduisant un polynôme et une indéterminée supplémentaires.

> sys:={x[p]-d,
x[a]^2+y[a]^2-1,x[b]^2+y[b]^2-1,
(x[p]-x[a])*x[a]+(y[p]-y[a])*y[a],
(x[p]-x[b])*x[b]+(y[p]-y[b])*y[b],
1-t*((x[a]-x[b])^2+(y[a]-y[b])^2), #
3*x[g]-x[p]-x[a]-x[b],3*y[g]-y[p]-y[a]-y[b]};

[Maple Math]
[Maple Math]
[Maple Math]

> gb:=Groebner[gbasis](sys,
lexdeg([x[p],y[p],x[a],y[a],x[b],y[b],t],[x[g],y[g]]));

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

> equ:=remove(has,gb,{p,a,b,t}):

> nops(equ);

[Maple Math]

> equ:=factor(equ[1]);

[Maple Math]

En procédant ainsi la quartique parasite a été éliminée. D'ailleurs son interprétation est facile. Si les deux points A et B sont confondus, le point G est situé aux deux tiers sur la corde qui joint le point P au point de tangence.

Reprise. On aurait pu employer un autre système pour décrire la situation géométrique. En effet l'orthogonalité de la tangente et du rayon montre que les deux points A et B sont sur le cercle de diamètre OP. On peut donc effectuer le calcul comme suit.

> sys:={x[p]-d,
x[a]^2+y[a]^2-1,x[b]^2+y[b]^2-1,
(x[a]-x[p])^2+(y[a]-y[p])^2+x[a]^2+y[a]^2-x[p]^2-y[p]^2,
(x[b]-x[p])^2+(y[b]-y[p])^2+x[b]^2+y[b]^2-x[p]^2-y[p]^2,
1-t*((x[a]-x[b])^2+(y[a]-y[b])^2),
3*x[g]-x[p]-x[a]-x[b],3*y[g]-y[p]-y[a]-y[b]};

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

> gb:=Groebner[gbasis](sys,
lexdeg([x[p],y[p],x[a],y[a],x[b],y[b],t],[x[g],y[g]]));

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

> equ:=remove(has,gb,{p,a,b,t}):

> nops(equ);

[Maple Math]

> equ:=factor(equ[1]);

[Maple Math]

On arrive au même résultat. On pourrait vérifier avec Groebner[inter_reduce] que les deux idéaux définis par les deux systèmes sont égaux.

Paramétrage. Passons à l'étude de la cubique obtenue. Nous constatons facilement que son équation possède deux composantes homogènes de degrés 2 et 3.

> series(subs(x[g]=t*X,y[g]=t*Y,Equ[1]),t);

[Maple Math]

Il en résulte que l'origine est un point double et que cette cubique est unicursale (c'est-à-dire possède un paramétrage rationnel). Le calcul suivant fournit un paramétrage rationnel.

> sol1x:=[solve(subs(y[g]=t*x[g],Equ[1]),{x[g]})];

[Maple Math]

> sol1x:=op(select(has,sol1,t));

[Maple Math]

> X1:=subs(sol1x,x[g]);

[Maple Math]

> Y1:=subs(sol1x,t*x[g]);

[Maple Math]

Avec ce paramétrage, il n'est pas difficile d'illustrer la situation. On peut alors se demander comment sont obtenus certains des points de la cubique qui sont intérieurs au cercle. C'est oublier que nous avons travaillé avec des polynômes et pas avec des nombres. Les nombres apparaissent comme racines de polynômes et rien n'interdit qu'ils soient complexes.

Retour en page principale