Calcul formel : Mode d'emploi - Exemples en Maple

Claude Gomez, Bruno Salvy, Paul Zimmermann

Masson, 1995

Chapitre V, section 3.4, exercice 3, page 142.

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.4 worksheet
Maple V.5 worksheet


La présentation donnée au paragraphe 3.2 de la réduction d'une forme quadratique n'est pas assez claire sur un point : la réduction n'est réellement possible (nous voulons dire algorithmique) que dans le cas de la dimension 2. En effet elle repose sur la détermination des valeurs propres d'une matrice symétrique réelle, c'est-à-dire sur la résolution d'une équation algébrique de degré n si la dimension vaut n. Or pour n plus grand que 4 on sait bien qu'il n'y pas d'expression par radicaux pour les racines et pour les degrés 3 et 4, les résultats renvoyés par le système emploient les formules de Cardan, qui peuvent faire intervenir des nombres complexes même si les racines sont réelles. Qui plus est, les procédures du package d'algèbre linéaire font apparaître des fonctions trigonométriques evaluées en des sous-mutliples d'arc tangente de nombres algébriques exprimés par radicaux. Pour les degrés 3 et 4, on se retrouve donc avec des expressions délicates à gérer et dans le cas général, on va être obligé d'employer un RootOf. On pourrait aborder la question en employant systématiquement RootOf, mais un autre problème surgit alors. La notation RootOf désigne l'une quelconque des racines d'un polynôme ; en fait c'est la racine que l'on obtient dans le quotient de l'anneau de polynômes par l'idéal généré par le polynôme. Or on veut disposer d'une ensemble de racines dans le corps des réels (ou plus généralement des complexes) qui sont la plupart du temps distinctes. Du coup cette notation, satisfaisante tant qu'on reste dans l'abstraction, ne convient plus pour gérer des racines dans un corps de nombres concret. Tout ceci fait que nous ne pouvons réellement traiter que le cas de la dimension 2. Pour les dimensions supérieures, il faudra que la chance soit avec nous pour que les racines cherchées s'expriment pas radicaux et d'une manière simple.

L'exercice recèle un petit piège ; en effet la matrice A n'est pas symétrique.

> A:=array(1..2,1..2,[[7/8,-sqrt(3)/4],[0,5/8]]);

[Maple Math]

> b:=array(1..2,1..1,[[2],[2*sqrt(3)]]);

[Maple Math]

> c:=7;

[Maple Math]

Ceci n'empêche pas de considérer la forme quadratique associée.

> X:=array(1..2,1..1,[[x],[y]]);

[Maple Math]

> Phi:=collect(evalm(transpose(X)&*A&*X+transpose(b)&*X+c)[1,1],
{x,y},distributed);

[Maple Math]

La matrice utile est la partie symétrique de la matrice proposée. On peut la récupérer par la procédure de l'exercice précédent,

> dismantle(Phi,[x,y]);

[Maple Math]

> A1:=matrix([[7/8, -1/8*sqrt(3)], [-1/8*sqrt(3), 5/8]]);

[Maple Math]

ou tout simplement en explicitant ce qu'est la partie symétrique.

> evalm((transpose(A)+A)/2);

[Maple Math]

Ensuite nous procédons comme dans le texte. L'emploi de la réduction de Jordan est un peu troublante mais le cas est particulier : comme la matrice est symétrique réelle, nous savons d'avance qu'elle se diagonalise dans une base orthonormée.

> linalg[jordan](A1,P);

[Maple Math]

La matrice de passage P est orthogonale, mais pas orthonormée. Elle est orthogonale parce qu'il y a deux valeurs propres distinctes et les droites propres sont orthogonales.

> eval(P);

[Maple Math]

> tPP:=evalm(transpose(P) &* P);

[Maple Math]

Nous modifions la matrice de passage pour la rendre orthogonale. On notera qu'en dimension supérieure et si une valeur propre était multiple, les vecteurs propres pris dans le sous-espace propre associé, qui est de dimension au moins 2, ne seraient pas nécessairement orthogonaux. On pourrait (et devrait) alors employer le procédé de Schmidt.

> Q:=array(1..2,1..2,diagonal):
Q[1,1]:=1/sqrt(tPP[1,1]):
Q[2,2]:=1/sqrt(tPP[2,2]):

> P1:=evalm(P&*Q);

[Maple Math]

Nous vérifions que la nouvelle matrice est bien orthogonale.

> evalm(transpose(P1) &* P1);

[Maple Math]

Nous explicitons le changement de base en termes de coordonnées.

> newX:=array(1..2,1..1,[[newx],[newy]]);

[Maple Math]

> XX:=evalm(P1&*newX);

[Maple Math]

> tosubs1:={x=XX[1,1],y=XX[2,1]}:

Ceci nous permet de calculer la nouvelle expression de la fonction polynôme. Bien sûr la partie du second degré ne comporte plus de terme rectangle.

> newPhi:=collect(subs(tosubs1,Phi),{newx,newy},distributed);

[Maple Math]

Nous cherchons ensuite si la conique associée à la fonction polynôme a un centre. Nous pouvons faire le calcul dans les anciennes coordonnées.

> center:=solve({diff(Phi,x),diff(Phi,y)},{x,y});

[Maple Math]

Nous pouvons aussi l'effectuer avec les nouvelles coordonnées.

> newcenter:=solve({diff(newPhi,newx),diff(newPhi,newy)},
{newx,newy});

[Maple Math]

La comparaison montre que cela revient au même.

> subs(newcenter,tosubs1);

[Maple Math]

Puisque la conique possède un unique centre, il s'agit d'une conique à centre et nous écrivons l'équation au centre.

> tosubs2:=subs(newxx=newx,newyy=newy,
subs(newcenter,{newxx=xi+newx,newyy=eta+newy}));

[Maple Math]

> newnewPhi:=collect(subs(tosubs2,newPhi),{xi,eta},distributed);

[Maple Math]

Nous pouvons expliciter le changement de coordonnées global.

> tosubs:=subs(tosubs2,tosubs1);

[Maple Math]

Disposant de l'équation réduite, il est facile de dessiner la conique, qui est ici une ellipse.

> arc:=subs(subs(xi=cos(t),eta=sqrt(2)*sin(t),tosubs),
[x,y,t=0..2*Pi]);

[Maple Math]

> plot(arc,scaling=constrained,labels=[x,y]);

Retour en page principale