Page d'accueil
Thèmes d'activités
<< Thème précédent
Thème suivant >>
> |
restart:
with(linalg): with(plots):
|
Warning,
the protected names norm and trace have been redefined and unprotected
Warning, the name changecoords has been redefined
Méthode utilisée
Soit
dans un repère orthonormal (o, i , j) du plan affine euclidien, une conique C
définie par son équation :
f (
x
,
y
) =
les
coefficients A, B, C, D, E, F étant réels. On repère alors la forme quadratique
de IR² associée:
q
(
x
,
y
) =
.
La
matrice de q
dans la base canonique ( i, j ) en
vecteurs s'ecrit
. M est une matrice symétrique qui
est diagonalisable
et il existe donc une base orthonormale B' = (
) de IR² formée de vecteurs propres
de M
.
On peut
donc diagonaliser la matrice dans une base orthonormale directe de vecteurs
propres. On note P la matrice de passage de ( i, j )
à (
) et
et
les
deux valeurs propres de la matrice M
.
La
matrice M
est donc semblable à
et
q ( ) =
.
B' étant orthonormale et une base
q
-orthogonale.
Dans
cette nouvelle base, on n'a donc plus de termes en
xy.
On se
ramène ensuite à des formes canoniques connues
-
Soit on trouve des coniques
propres: paraboles, hyperboles et des ellipses (ou des cercles)
-
Soit on trouve des coniques
dégénérées : couple de droites, droite, point, ensemble vide.
Premier cas
: si 0 n'est pas valeur propre de M
Dans
ce cas, det(M) = ac - b² =
. Alors la conique C admet un
centre de symétrie
dans
(O, i , j)
où (
) vérifie le système :
=
0 et =
0
En
effet, les formules
et
permettent
d'obtenir l'équation de la conique C dans (
)
sous la forme :
C :
=
a . Les termes en x et y disparaissent.
Ainsi
C : q(
M) =
a
, s'écrit sous la forme C : =
a
dans le repère (
,
).
Sous cas 1
Si a
= 0 alors C est la réunion de 2 droites si

<0
ou C = {
}
si

>0
Sous cas 2
Si
alors C :
. Distinguons alors 2 cas :
Sous cas i
Si

> 0 , C = vide
ou C :
, C est donc une ellipse de
centre
(on a alors B² - AC < 0)
Sous cas ii
Si

< 0 , C :
, C est donc une hyperbole de
centre
(on a alors B² - AC > 0)
Second cas :
si 0 est valeur propre de M
Dans
ce cas det(M) = ac - b² =
.
Si par
exemple
et
, alors q (
) =
Dans
le repère (O,
)
l'équation de la conique C est de la forme
que l'on peut mettre
dans le repère (O,
)
sous la forme C :
Sous cas 1
Si
, alors C :
X = - a
est une droite
Sous cas 2
Si
, alors C :
dans un repère (O',
).
C est une parabole et on a B² - AC = 0.
Procédure Quadratique
Une expression
expr
est une forme quadratique en les variables
X=[
...
] si les 3 conditions sont
vérifiées:
expr
vaut 0 au point
[0,0,...,0].
Pour
tout i
,
vaut 0 au point [0,0,...,0], c'est
à dire que la différentielle de
expr
est nulle au point [0,0,...,0].
Pour
tout (
i,j
),
est une constante.
> |
Quadratique:=proc(expr,X)
local d,d1,d2,i,j;
d:=subs(seq(X[i]=0,i=1..nops(X)),expr);
if d<>0 then return false fi;
for j to nops(X) do
d1:=diff(expr,X[j]):
d:=subs(seq(X[i]=0,i=1..nops(X)),d1);
if d<>0 then return false fi;
od;
for i to nops(X) do
for j to nops(X) do
d2:=diff(expr,X[i],X[j]):
if not type(d2,constant) then return false fi;
od
od;
true
end proc:
|
> |
q:=5*x^2+5*y^2+6*x*y: Quadratique(q,[x,y]);
|
Procédure ExtraireFormeQuad
Procédure d'extraction de la partie quadratique d'une expression
expr
en
X
:
> |
ExtraireFormeQuad:=proc(expr,X)
local e,q;
q:=0:
for e in expr do
if Quadratique(e,X) then q:=q+e fi
end do:
q
end proc:
|
> |
f:=5*x^2+5*y^2+6*x*y-4*x+4*y;
|
> |
q:=ExtraireFormeQuad(f,[x,y]);
|
Procédure de calcul du centre de la conique
> |
centre:=proc(expr,X)
local k,sys,c,s;
sys:={seq(diff(expr,X[i]),i=1..nops(X))};
s:=solve(sys,convert(X,set)):
c:=array(1..nops(X)):
for k to nops(s) do
if lhs(s[k])=X[1] then c[1]:=rhs(s[k])
elif lhs(s[k])=X[2] then c[2]:=rhs(s[k])
else c[3]:=rhs(s[k]) fi
od:
convert(c,list)
end proc:
|
Procédure nouvelle_equation
Cette
procédure effectue un changement de repère: connaissant l'équation
f
dans l'ancien repère, la nouvelle
origine pt
,
la matrice de passage P
de l'ancienne à la nouvelle base,
et les variables var
, elle retourne
l'équation dans le nouveau repère.
> |
nouvelle_equation:=proc(f,pt,P,var)
local k,X,Y,Z,x,y,nx,s;
nx:=[X,Y,Z]:
x:=matrix([seq([nx[i]],i=1..nops(var))]);
y:=evalm(P&*x);
s:=seq(var[k]=y[k,1]+pt[k],k=1..nops(var));
unapply(simplify(expand(subs(s,f))),op(1..nops(var),nx));
end proc:
|
> |
nouvelle_equation(f,[1,-1],matrix([[1/2*2^(1/2), 1/2*2^(1/2)],
[-1/2*2^(1/2), 1/2*2^(1/2)]]),[x,y]);
|
Procédure coord
coord
donne les valeurs numériques des
coordonnées dans l'ancien repère (o,i,j) d'un point de coordonnées
var
dans le nouveau
repère (
pt
,I,J).
P
est la matrice de passage
de l'ancienne à la nouvelle base.
Cette procédure servira pour tracer la conique dans le repère initial (o,i,j).
> |
coord:=proc(var,pt,P)
local x,y;
x:=matrix([seq([var[i]],i=1..nops(var))]);
y:=evalm(P&*x);
seq(evalf(y[k,1]+pt[k]),k=1..nops(var))
end proc:
|
> |
coord([sqrt(2),0],[1,-1],matrix([[1/2*2^(1/2), 1/2*2^(1/2)], [-1/2*2^(1/2),
1/2*2^(1/2)]])); |
Procédure parabole
Cette
procédure traite le cas det(D)=0 ( 0 est valeur propre) qui va donner la
parabole comme seule conique propre.
> |
parabole:=proc(eq,P,xmin,xmax,ymin,ymax)
local a,b,c,delta,e,s;
e:=eq:
if coeff(e,X,2)<>0 then e:=simplify(e/coeff(e,X,2))
elif coeff(e,Y,2)<>0 then e:=simplify(e/coeff(e,Y,2)) fi:
c:=subs(X=0,Y=0,e):
if coeff(e,X,2)=1 then
a:=coeff(e,X,1): b:=coeff(e,Y,1):
if b=0 then print(`Conique dégénérée:`):
delta:=a^2-4*c:
if delta<0 then print(`Ensemble vide`)
elif delta=0 then print(`Droite d'équation:`):print(X=-a/2)
else
print(`réunion des 2 droites d'équation:`):
print(X=simplify((-a-sqrt(delta))/2),X=simplify((-a+sqrt(delta))/2))
fi;
else
e:=(X+a/2)^2+b*(Y+(c-a^2/4)/b):
print(`Parabole d'équation:`):print(e=0):
s:=[-a/2,-(c-a^2/4)/b]:
print(`de sommet: s`=s);
print(`Equation dans (s,I,J):`);
e:=X^2+b*Y : print(e=0): return
elements_car_parabole(e,s,P,xmin,xmax,ymin,ymax)
fi
else
if coeff(e,Y,2)=1 then
a:=coeff(e,Y,1): b:=coeff(e,X,1):
if b=0 then print(`Conique dégénérée:`):
delta:=a^2-4*c:
if delta<0 then print(`Ensemble vide`)
elif delta=0 then print(`Droite d'équation:`):print(Y=-a/2)
else
print(`réunion des 2 droites d'équation:`):
print(Y=simplify((-a-sqrt(delta))/2),Y=simplify((-a+sqrt(delta))/2))
fi;
else
e:=(Y+a/2)^2+b*(X+(c-a^2/4)/b):
print(`Parabole d'équation:`):print(e=0):
s:=[-(c-a^2/4)/b,-a/2]:
print(`de sommet: s`=s);
print(`Equation dans (s,I,J):`);
e:=Y^2+b*X: print(e=0): return
elements_car_parabole(e,s,P,xmin,xmax,ymin,ymax)
fi
fi
fi;
e=0
end:
|
Procédure elements_car_parabole
Cette
procédure donne les éléments caractéristiques de la parabole:
> |
elements_car_parabole:=proc(eq,pt,P,xmin,xmax,ymin,ymax)
local p,axe1,axe2,courbe,points,dir;
print(`Elements caractéristiques dans (s,I,J):`);
if coeff(eq,Y,2)=1 then p:=simplify(-1/2*coeff(eq,X,1)):print(`axe focal:
`=(s,I))
else p:=simplify(-1/2*coeff(eq,Y,1)):print(`axe focal: `=(s,J)) fi:
axe1:=plot([pt[1]+t*P[1,1],pt[2]+t*P[2,1],t=-15..15],linestyle=DOT):
axe2:=plot([pt[1]+t*P[1,2],pt[2]+t*P[2,2],t=-15..15],linestyle=DOT):
print(`paramètre: p`=p);
print(`excentricité: e`=1);
points:=pt;
print(`foyer:`);
if coeff(eq,Y,2)=1 then print(F(p/2,0)):points:=points,[coord([p/2,0],pt,P)]
else print(F(0,p/2)):points:=points,[coord([0,p/2],pt,P)] fi:
points:=pointplot([points],symbol=CROSS);
print(`directrice:`);
if coeff(eq,Y,2)=1 then
print(X=-p/2):dir:=plot([coord([-p/2,t],pt,P),t=-15..15],color=blue) else
print(Y=-p/2):dir:=plot([coord([t,-p/2],pt,P),t=-15..15],color=blue) fi:
if coeff(eq,Y,2)=1 then courbe:=plot([coord([t^2/(2*p),t],pt,P),t=-15..15])
else
courbe:=plot([coord([t,t^2/(2*p)],pt,P),t=-15..15]) fi;
display({courbe,axe1,axe2,points,dir},scaling=constrained,view=[xmin..xmax,ymin..ymax])
end proc:
|
Procédure elements_car_ellipse
Cette
procédure donne les éléments caractéristiques de l'ellipse:
> |
elements_car_ellipse:=proc(a,b,pt,P,xmin,xmax,ymin,ymax)
local c1,e,axe1,axe2,courbe,points,dirs;
print(`Elements caractéristiques dans (c,I,J):`);
if evalf(a)<>evalf(b) then
if evalf(a)>evalf(b) then c1:=sqrt(a^2-b^2): e:=c1/a
else c1:=sqrt(b^2-a^2): e:=c1/b fi:
print(` a`=simplify(a),` b`=simplify(b), ` c`=simplify(c1));
if evalf(a)>evalf(b) then print(`grand axe (ou axe focal): `=(c,I))
else print(`grand axe (ou axe focal): `=(c,J)) fi:
fi;
axe1:=plot([pt[1]+t*P[1,1],pt[2]+t*P[2,1],t=-15..15],linestyle=DOT):
axe2:=plot([pt[1]+t*P[1,2],pt[2]+t*P[2,2],t=-15..15],linestyle=DOT):
if evalf(a)<>evalf(b) then
print(`excentricité (0<e<1) e`=simplify(e));
print(`sommets:`);
print(A1(-a,0),A2(a,0),B1(0,-b),B2(0,b));
print(`foyers:`);
if evalf(a)>evalf(b) then print(F1(-c1,0),F2(c1,0)) else
print(F1(0,-c1),F2(0,c1)) fi;
points:=[coord([-a,0],pt,P)],[coord([a,0],pt,P)],[coord([0,-b],pt,P)],[coord([0,b],pt,P)]:
if evalf(a)>evalf(b) then
points:=points,[coord([-c1,0],pt,P)],[coord([c1,0],pt,P)]
else points:=points,[coord([0,-c1],pt,P)],[coord([0,c1],pt,P)] fi:
points:=pointplot([points],symbol=CROSS);
print(`directrices:`);
if evalf(a)>evalf(b) then
print(X=simplify(-a^2/c1),X=simplify(a^2/c1)):
dirs:=plot([coord([-a^2/c1,t],pt,P),t=-15..15],color=blue),plot([coord([a^2/c1,t],pt,P),t=-15..15],color=blue)
else print(simplify(Y=-b^2/c1),simplify(X=b^2/c1)):
dirs:=plot([coord([t,-b^2/c1],pt,P),t=-15..15],color=blue),plot([coord([t,b^2/c1],pt,P),t=-15..15],color=blue):
fi;
fi:
courbe:=plot([coord([a*cos(t),b*sin(t)],pt,P),t=0..2*Pi]);
if evalf(a)<>evalf(b) then
display({courbe,axe1,axe2,points,dirs},scaling=constrained,view=[xmin..xmax,ymin..ymax])
else
display(courbe,pointplot([[coord([0,0],pt,P)]],symbol=CROSS),scaling=constrained,view=[xmin..xmax,ymin..ymax])
fi
end proc:
|
Procédure elements_car_hyperbole
Cette
procédure donne les éléments caractéristiques de l'hyperbole:
> |
elements_car_hyperbole:=proc(a,b,s,pt,P,xmin,xmax,ymin,ymax)
local e,c1,axe1,axe2,courbe,points,dirs,asys;
print(`Elements caractéristiques dans (c,I,J):`);
c1:=sqrt(a^2+b^2):
if s=1 then e:=c1/a else e:=c1/b fi:
print(` a`=simplify(a),` b`=simplify(b), ` c`=simplify(c1));
if s=1 then print(`axe focal (ou transverse): `=(c,I))
else print(`axe focal (ou transverse): `=(c,J)) fi:
axe1:=plot([pt[1]+t*P[1,1],pt[2]+t*P[2,1],t=-15..15],linestyle=DOT):
axe2:=plot([pt[1]+t*P[1,2],pt[2]+t*P[2,2],t=-15..15],linestyle=DOT):
print(`excentricité (e>1) e`=simplify(e));
print(`sommets:`);
if s=1 then
print(A1(-a,0),A2(a,0)):points:=[coord([-a,0],pt,P)],[coord([a,0],pt,P)]
else print(B1(0,-b),B2(0,b)):
points:=[coord([0,-b],pt,P)],[coord([0,b],pt,P)]: fi;
print(`foyers:`);
if s=1 then
print(F1(-c1,0),F2(c1,0)):points:=points,[coord([-c1,0],pt,P)],[coord([c1,0],pt,P)]
else
print(F1(0,-c1),F2(0,c1)):points:=points,[coord([0,-c1],pt,P)],[coord([0,c1],pt,P)]
fi;
points:=pointplot([points],symbol=CROSS);
print(`directrices:`);
if s=1 then print(X=simplify(-a^2/c1),X=simplify(a^2/c1)):
dirs:=plot([coord([-a^2/c1,t],pt,P),t=-15..15],color=blue),plot([coord([a^2/c1,t],pt,P),t=-15..15],color=blue)
else print(simplify(Y=-b^2/c1),simplify(X=b^2/c1)):
dirs:=plot([coord([t,-b^2/c1],pt,P),t=-15..15],color=blue),plot([coord([t,b^2/c1],pt,P),t=-15..15],color=blue):
fi;
print(`asymptotes:`);
print(Y=-b/a*X,Y=b/a*X);
asys:=plot([coord([t,-b/a*t],pt,P),t=-15..15],color=black,linestyle=DOT),plot([coord([t,b/a*t],pt,P),t=-15..15],color=black,linestyle=DOT):
if s=1 then
courbe:=plot([coord([a*cosh(t),b*sinh(t)],pt,P),t=-5..5]),plot([coord([-a*cosh(t),b*sinh(t)],pt,P),t=-5..5])
else
courbe:=plot([coord([a*sinh(t),b*cosh(t)],pt,P),t=-5..5]),plot([coord([a*sinh(t),-b*cosh(t)],pt,P),t=-5..5])
fi;
display({courbe,axe1,axe2,points,dirs,asys},scaling=constrained,view=[xmin..xmax,ymin..ymax])
end proc:
|
Procédure conique
C'est la
procédure principale de la feuille. Elle reçoit en paramètres:
-
une expression
expr
des variables
var
.
-
quatre réels
xmin
,
xmax
,
ymin
,
ymax
.
Elle extrait la forme quadratique
q
associée à
expr
, réduit sa matrice, calcule une base [I,J]
de IR² orthonormale et qui est aussi
q
-orthogonale,
analyse la nature de la conique et donne ses éléments caractéristiques ainsi que
sa représentation graphique dans la fenêtre [
xmin
,
xmax
,
ymin
,
ymax
].
> |
conique:=proc(expr,var,xmin,xmax,ymin,ymax)
local e,k,q,v,A,D,G,P,c,eq,sm,vp,alpha,beta,gamma,a,b;
q:=ExtraireFormeQuad(expr,var);
for k in expr-q do
if not type(k,constant) then
for v in var do
if not type(diff(k,v),constant) then error
"Cette expression ne correspond pas à la forme attendue:
Ax²+2Bxy+Cy²+Dx+Ey+F" fi
od
fi
od;
if q=0 then error "Forme quadratique associée nulle" fi:
print(`Forme quadratique associée: q`=q);
print(`Matrice de la forme quadratique associée:`);
A:=matrix([seq([seq(diff(q,var[i],var[j])/2,j=1..2)],i=1..2)]);
print(`A `=evalm(A));
vp:=sort([eigenvals(A)]):
print(`Valeur propres de A `=vp);
D:=jordan(A,'P1');
print(`Matrice diagonale semblable à A: D`=evalm(D));
G:=map(normalize, GramSchmidt([col(P1,1..2)]));
P:=map(simplify,concat(op(G)));
print(`Matrice de passage orthogonale: P`=evalm(P));
print(`Directions principales de la conique:`);
print(`I `=col(P,1),` J `=col(P,2));
if det(D)<>0 then
c:=centre(expr,var): print(`Conique à centre: c`=c):
print(`Equation dans (c,I,J): `):
eq:=nouvelle_equation(f,c,P,var):
alpha:=-eq(0,0);
print(collect(eq(X,Y),[X,Y])=0):
if alpha=0 then
print(`Conique dégénérée`);
if det(D)>0 then
print(`réduite au centre: c`={c})
else print(`réunion des 2 droites d'équation:`);
print(Y=sqrt(-vp[1]/vp[2])*X, Y=-sqrt(-vp[1]/vp[2])*X)
fi
else # alpha<>0
if evalf(det(D))>0 then
if evalf(alpha/vp[1])<0 and evalf(alpha/vp[2])<0 then
print(eq(X,Y)=0):
print(`Conique dégénérée: ensemble vide`)
else a:=sqrt(alpha/vp[1]): b:=sqrt(alpha/vp[2]):
print(X^2/a^2+Y^2/b^2=1):
if evalf(a)<>evalf(b) then print(`Ellipse de centre c`) else
print(`cercle de centre c, rayon`=a) fi:
elements_car_ellipse(a,b,c,P,xmin,xmax,ymin,ymax):
fi
else # det(D)<0
if evalf(alpha/vp[1])>0 and evalf(alpha/vp[2])<0 then
a:=sqrt(alpha/vp[1]): b:=sqrt(-alpha/vp[2]): sm:=1:
print(X^2/a^2-Y^2/b^2=1):
else
a:=sqrt(-alpha/vp[1]): b:=sqrt(alpha/vp[2]): sm:=-1:
print(X^2/a^2-Y^2/b^2=-1):
fi:
print(`Hyperbole de centre c`):
elements_car_hyperbole(a,b,sm,c,P,xmin,xmax,ymin,ymax):
fi
fi
else # det(D)=0
print(`Equation dans (o,I,J): `):
eq:=nouvelle_equation(f,[0,0],P,var):
print(eq(X,Y)=0);
parabole(eq(X,Y),P,xmin,xmax,ymin,ymax);
fi:
end:
|
Exemple 1 : Affichage d'un message d'erreur
> |
f:=5*x^2+5*y^2+6*x*y-4*x+4*y-12*x^2*y^2; conique(f,[x,y],-10,10,-10,10);
|
Error,
(in conique) Cette expression ne correspond pas à la forme attendue:
Ax²+2Bxy+Cy²+Dx+Ey+F
Exemple 2 : Etude d'une ellipse
> |
f:=5*x^2+5*y^2+6*x*y-4*x+4*y; conique(f,[x,y],-1,3,-3,1);
|
Exemple 3 : Etude d'un cercle
> |
f:=16*x^2+16*y^2+30*x-34*y-169; conique(f,[x,y],-5,4,-4,6);
|
Exemple 4 : Etude d'une hyperbole
> |
f:=x^2+4*x*y+y^2-8*x+4*y-1; conique(f,[x,y],-15,10,-10,15);
|
Exemple 5 : Etude d'une parabole
> |
f:=4*x^2+4*x*y+y^2-8*x+16*y-17; conique(f,[x,y],-8,8,-10,6);
|
Exemple 6 : Un cas de dégénérescence
> |
f:=expand(4*(x-1)^2+(y-x)^2+5); conique(f,[x,y],-5,5,-5,5);
|

|