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
Soit un repère orthonormal (O, i , j, k) de E. Une quadrique est une surface notée S dont une équation dans ce repère s'écrit
f ( x, y,z ) = =0 (avec , , , , , , , , , coefficients
réels) On pose q( x, y, z ) =
q est donc une forme quadratique (supposée non nulle) de E dont la matrice A dans la base ( i, j, k ) s'écrit
A est une matrice symétrique réelle, donc diagonalisable et il existe une base orthonormale B'=( ) de E formée de vecteurs propres de A.
Diagonalisons la matrice dans une base orthonormale directe de vecteurs propres.On note P la matrice de passage de
( i,j,k ) vers B' et , ,et les
trois valeurs propres de la matrice A. Ainsi, la matrice A est semblable à et q ( + ) = + .
B' est aussi une base q-orthogonale.
Premier cas : 0 n'est pas valeur propre de A
Dans ce cas, det(A) = . Alors S admet un centre de symétrie dans (O, i , j, k ) où
( ) vérifie le système : et et
En effet, les formules
et et permettent d'obtenir l'équation de la quadrique dans ( ): = , les temes en x, y, et z disparaissant. Ainsi S : q( M) = , s'écrit sous la forme S : + = dans le repère ( , , ).
Sous cas 1
Si = 0 , S : +  =
0 est un cône du second degré de sommet . Si ont même signe alors X = Y = Z = 0 et donc S = { }
Sinon, par exemple , , ont même signe et S : est
un cône elliptique.
Sous cas 2
Si ,
Si ont même signe, S est l'ensemble vide ou S : est un ellipsoïde. Sinon, par exemple , , ont même signe et S : est un hyperboloïde à une nappe ou S : est un hyperboloïde à deux nappes
Second cas : 0 est valeur propre simple de A
Dans ce cas, det(A) = 0. Si par exemple , et on a alors : q ( + ) = . Dans ( , , ),
l'équation de S s'écrit que l'on peut mettre sous la forme ' = 0
Sous cas 1
Si = 0, soit dans ( , , ).
Dans ( , , ),
S : est un cylindre de direction R
.
Sous cas i
Si =
0 , Si ont
même signe, alors X = Y = 0 . S est la droite ( ).
Sinon, S est la réunion de 2 plans.
Sous cas ii
Si
alors
Alors S est l'ensemble vide ou S : est un cylindre elliptique ou S : est un cylindre hyperbolique.
Sous cas 2
Si dans ( , , ),
Soit .Dans
( , , ),
S :
Si ont même signe, alors S : est un paraboloïde elliptique. Sinon, est un paraboloïde hyperbolique.
Troisième cas : 0 est valeur propre double de A
Alors det(A)=0. Si par exemple et =
0 on a alors q ( + ) =
Dans ( , , ),
l'équation de S s'écrit =
0 que l'on peut mettre sous la forme S :
Soit . Dans ( , , ),
S :
Si = 0 alors S : . Donc S est l'ensemble vide
ou S est un plan ou S est la réunion de 2 plans.
Si ou , soit '
vecteur unitaire tel que { X=0 et }, et '= ' ^ (produit vectoriel) L'équation de S dans ( , , ', ')
devient alors S : avec
Par changement d'origine, dans un repère ( '
, , '
, ')
, S a une équation de la forme S :
S est un cylindre parabolique de direction R '.
Cette feuille de calcul contient des procédures qui vont permettre de déterminer
la nature de S et d'en donner les éléments
caractéristiques ainsi que la représentation graphique.
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:=x^2+y^2+z^2-2*x*y+2*x*z: Quadratique(q,[x,y,z]);
|
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:=x^2+y^2+z^2-2*x*y+2*x*z+3*x-y+z+1;
|
> |
q:=ExtraireFormeQuad(f,[x,y,z]);
|
Procédure de calcul du
centre de la quadrique
> |
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:
|
> |
collect(nouvelle_equation(f,[1/2, 1, -1],matrix([[0, 1/2*2^(1/2),
-1/2*2^(1/2)], [1/2*2^(1/2), -1/2, -1/2], [1/2*2^(1/2), 1/2,
1/2]]),[x,y,z])(X,Y,Z),[X,Y,Z]);
|
Procédure coord
coord
donne les valeurs numériques des
coordonnées dans l'ancien repère (o,i,j,k) d'un point de coordonnées
var
dans (
pt
,I,J,K).
P
est la
matrice de passage de l'ancienne à la nouvelle base.
Cette procédure servira pour tracer la quadrique dans le repère initial
(o,i,j,k).
> |
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([1,2,3],[1/2,
1, -1],matrix([[0, 1/2*2^(1/2), -1/2*2^(1/2)], [1/2*2^(1/2), -1/2, -1/2],
[1/2*2^(1/2), 1/2, 1/2]])); |
Procédure axes
Cette procédure trace les axes principaux de la quadrique:
> |
axes:=proc(pt,P,tmin,tmax)
spacecurve([pt[1]+t*P[1,1],pt[2]+t*P[2,1],pt[3]+t*P[3,1],t=tmin..tmax],thickness=2,color=red),
spacecurve([pt[1]+t*P[1,2],pt[2]+t*P[2,2],pt[3]+t*P[3,2],t=tmin..tmax],thickness=2,color=red),
spacecurve([pt[1]+t*P[1,3],pt[2]+t*P[2,3],pt[3]+t*P[3,3],t=tmin..tmax],thickness=2,color=red)
end proc:
|
Procédure
elements_car_cone_elliptique
Cette procédure donne les éléments caractéristiques d'un cône elliptique:
> |
elements_car_cone_elliptique:=proc(eq,pt,P)
local a,b,c,param,surf:
print(`Quadrique à centre unique, surface réglée`);
a:=1/sqrt(abs(coeff(eq,X,2))): b:=1/sqrt(abs(coeff(eq,Y,2))):
c:=1/sqrt(abs(coeff(eq,Z,2))):
if evalf(coeff(eq,X,2))<0 then
param:=[X=a*lambda,Y=b*lambda*cos(theta),Z=c*lambda*sin(theta)],theta=0..2*Pi,lambda=-infinity..infinity;
surf:=plot3d([coord([a*lambda,b*lambda*cos(theta),c*lambda*sin(theta)],pt,P)],theta=0..2*Pi,lambda=-100..100):
if b=c then print(`Cône de révolution d'axe (c,I)`) fi
elif evalf(coeff(eq,Y,2))<0 then
param:=[X=a*lambda*cos(theta),Y=b*lambda,Z=c*lambda*sin(theta)],theta=0..2*Pi,lambda=-infinity..infinity;
surf:=plot3d([coord([a*lambda*cos(theta),b*lambda,c*lambda*sin(theta)],pt,P)],theta=0..2*Pi,lambda=-100..100):
if a=c then print(`Cône de révolution d'axe (c,J)`) fi
else
param:=[X=a*lambda*cos(theta),Y=b*lambda*sin(theta),Z=c*lambda],theta=0..2*Pi,lambda=-infinity..infinity;
surf:=plot3d([coord([a*lambda*cos(theta),b*lambda*sin(theta),c*lambda],pt,P)],theta=0..2*Pi,lambda=-100..100):
if a=b then print(`Cône de révolution d'axe (c,K)`) fi
fi:
print(`Paramétrage: `,param):
display({surf,axes(pt,P,-100,100)},labels=[x,y,z],axes=boxed,scaling=constrained)
end proc:
|
Procédure
elements_car_ellipsoide
Cette procédure donne les éléments caractéristiques d'un ellipsoïde:
> |
elements_car_ellipsoide:=proc(eq,pt,P)
local a,b,c,param,surf:
a:=1/sqrt(coeff(eq,X,2)): b:=1/sqrt(coeff(eq,Y,2)):
c:=1/sqrt(coeff(eq,Z,2)):
print(`Quadrique à centre unique, surface non réglée`);
param:=[X=a*cos(phi)*cos(theta),Y=b*cos(phi)*sin(theta),Z=c*sin(phi)],theta=0..2*Pi,phi=-Pi/2..Pi/2;
surf:=plot3d([coord([a*cos(phi)*cos(theta),b*cos(phi)*sin(theta),c*sin(phi)],pt,P)],theta=0..2*Pi,phi=-Pi/2..Pi/2):
if a=b and b=c then print(`Sphère: rayon`=a)
else
if a=b then print(`Ellipsoïde de révolution d'axe (c,K)`) fi;
if b=c then print(`Ellipsoïde de révolution d'axe (c,I)`) fi;
if c=a then print(`Ellipsoïde de révolution d'axe (c,J)`) fi;
fi;
print(`Paramétrage: `,param):
display({surf,axes(pt,P,-100,100)},labels=[x,y,z],axes=boxed,scaling=constrained,view=[pt[1]-a*1.5..pt[1]+a*1.5,pt[2]-b*1.5..pt[2]+b*1.5,pt[3]-c*1.5..pt[3]+c*1.5])
end proc:
|
Procédure elements_car_hyp1
Cette procédure donne les éléments caractéristiques d'un hyperboloïde à une
nappe:
> |
elements_car_hyp1:=proc(eq,pt,P)
local a,b,c,param,surf:
print(`Quadrique à centre unique, surface réglée`);
a:=1/sqrt(abs(coeff(eq,X,2))): b:=1/sqrt(abs(coeff(eq,Y,2))):
c:=1/sqrt(abs(coeff(eq,Z,2))):
if evalf(coeff(eq,X,2))<0 then
param:=[X=a*sinh(phi),Y=b*cosh(phi)*cos(theta),Z=c*cosh(phi)*sin(theta)],theta=-infinity..infinity,phi=-infinity..infinity;
surf:=plot3d([coord([a*sinh(phi),b*cosh(phi)*cos(theta),c*cosh(phi)*sin(theta)],pt,P)],theta=0..2*Pi,phi=-arcsinh(10/a)..arcsinh(10/a)):
if b=c then print(`Hyperboloïde de révolution à une nappe d'axe (c,I)`) fi
elif evalf(coeff(eq,Y,2))<0 then
param:=[X=a*cosh(phi)*cos(theta),Y=b*sinh(phi),Z=c*cosh(phi)*sin(theta)],theta=-infinity..infinity,phi=-infinity..infinity;
surf:=plot3d([coord([a*cosh(phi)*cos(theta),b*sinh(phi),c*cosh(phi)*sin(theta)],pt,P)],theta=0..2*Pi,phi=-arcsinh(10/b)..arcsinh(10/b)):
if a=c then print(`Hyperboloïde de révolution à une nappe d'axe (c,J)`) fi
else
param:=[X=a*cosh(phi)*cos(theta),Y=b*cosh(phi)*sin(theta),Z=c*sinh(phi)],theta=-infinity..infinity,phi=-infinity..infinity;
surf:=plot3d([coord([a*cosh(phi)*cos(theta),b*cosh(phi)*sin(theta),c*sinh(phi)],pt,P)],theta=0..2*Pi,phi=-arcsinh(10/c)..arcsinh(10/c)):
if a=b then print(`Hyperboloïde de révolution à une nappe d'axe (c,K)`) fi
fi:
print(`Paramétrage: `,param):
display({surf,axes(pt,P,-10,10)},labels=[x,y,z],axes=boxed,scaling=constrained)
end proc:
|
Procédure elements_car_hyp2
Cette procédure donne les éléments caractéristiques d'un hyperboloïde à deux
nappes:
> |
elements_car_hyp2:=proc(eq,pt,P)
local a,b,c,param,surf:
print(`Quadrique à centre unique, surface non réglée`);
a:=1/sqrt(abs(coeff(eq,X,2))): b:=1/sqrt(abs(coeff(eq,Y,2))):
c:=1/sqrt(abs(coeff(eq,Z,2))):
if evalf(coeff(eq,X,2))<0 then
param:=[X=epsilon*a*cosh(phi),Y=b*sinh(phi)*cos(theta),Z=c*sinh(phi)*sin(theta)],theta=0..2*Pi,phi=-infinity..infinity,epsilon=±1;
surf:=plot3d([coord([a*cosh(phi),b*sinh(phi)*cos(theta),c*sinh(phi)*sin(theta)],pt,P)],theta=0..2*Pi,phi=-arccosh(10/a)..arccosh(10/a)),plot3d([coord([-a*cosh(phi),b*sinh(phi)*cos(theta),c*sinh(phi)*sin(theta)],pt,P)],theta=0..2*Pi,phi=-arccosh(10/a)..arccosh(10/a)):
if b=c then print(`Hyperboloïde de révolution à deux nappes d'axe (c,I)`) fi
elif evalf(coeff(eq,Y,2))<0 then
param:=[X=a*sinh(phi)*cos(theta),Y=epsilon*b*cosh(phi),Z=c*sinh(phi)*sin(theta)],theta=0..2*Pi,phi=-infinity..infinity,epsilon=±1;
surf:=plot3d([coord([a*sinh(phi)*cos(theta),b*cosh(phi),c*sinh(phi)*sin(theta)],pt,P)],theta=0..2*Pi,phi=-arccosh(10/b)..arccosh(10/b)),plot3d([coord([a*sinh(phi)*cos(theta),-b*cosh(phi),c*sinh(phi)*sin(theta)],pt,P)],theta=0..2*Pi,phi=-arccosh(10/b)..arccosh(10/b)):
if a=c then print(`Hyperboloïde de révolution à deux nappes d'axe (c,J)`) fi
else
param:=[X=a*sinh(phi)*cos(theta),Y=b*sinh(phi)*sin(theta),Z=epsilon*c*cosh(phi)],theta=-0..2*Pi,phi=-infinity..infinity,epsilon=±1;
surf:=plot3d([coord([a*sinh(phi)*cos(theta),b*sinh(phi)*sin(theta),c*cosh(phi)],pt,P)],theta=0..2*Pi,phi=-arccosh(10/c)..arccosh(10/c)),plot3d([coord([a*sinh(phi)*cos(theta),b*sinh(phi)*sin(theta),-c*cosh(phi)],pt,P)],theta=0..2*Pi,phi=-arccosh(10/c)..arccosh(10/c)):
if a=b then print(`Hyperboloïde de révolution à deux nappes d'axe (c,K)`) fi
fi:
print(`Paramétrage: `,param):
display({surf,axes(pt,P,-10,10)},labels=[x,y,z],axes=boxed,scaling=constrained)
end proc:
|
Procédure
elements_car_cyl_ell
Cette procédure donne les éléments caractéristiques d'un cylindre elliptique:
> |
elements_car_cyl_ell:=proc(eq,pt,P)
local a,b,param,surf:
print(`Quadrique admettant une droite des centres (l'axe du cylindre),
surface réglée`);
if evalf(coeff(eq,X,2))=0 then
a:=1/sqrt(abs(coeff(eq,Y,2))): b:=1/sqrt(abs(coeff(eq,Z,2))):
print(`Axe du cylindre: (s,I)`):
if a=b then print(`Cylindre de révolution d'axe (s,I), de rayon a`) fi:
param:=[X=lambda,Y=a*cos(theta),Z=b*sin(theta)],theta=0..2*Pi,lambda=-infinity..infinity:
surf:=plot3d([coord([lambda,a*cos(theta),b*sin(theta)],pt,P)],theta=0..2*Pi,lambda=-2..2):
elif evalf(coeff(eq,Y,2))=0 then
a:=1/sqrt(abs(coeff(eq,X,2))): b:=1/sqrt(abs(coeff(eq,Z,2))):
print(`Axe du cylindre: (s,J)`):
if a=b then print(`Cylindre de révolution d'axe (s,J), de rayon a`) fi:
param:=[X=a*cos(theta),Y=lambda,
Z=b*sin(theta)],theta=0..2*Pi,lambda=-infinity..infinity:
surf:=plot3d([coord([a*cos(theta),lambda,b*sin(theta)],pt,P)],theta=0..2*Pi,lambda=-2..2):
else
a:=1/sqrt(abs(coeff(eq,X,2))): b:=1/sqrt(abs(coeff(eq,Y,2))):
print(`Axe du cylindre: (s,K)`):
if a=b then print(`Cylindre de révolution d'axe (s,K), de rayon a`) fi:
param:=[X=a*cos(theta),Y=b*sin(theta),Z=lambda],theta=0..2*Pi,lambda=-infinity..infinity:
surf:=plot3d([coord([a*cos(theta),b*sin(theta),lambda],pt,P)],theta=0..2*Pi,lambda=-2..2):
end if:
print(`Paramétrage: `,param):
display({surf,axes(pt,P,-max(a,b),max(a,b))},labels=[x,y,z],axes=boxed,scaling=constrained)
end proc:
|
Procédure
elements_car_cyl_hyp
Cette procédure donne les éléments caractéristiques d'un cylindre hyperbolique:
> |
elements_car_cyl_hyp:=proc(eq,pt,P)
local a,b,c,param,surf:
print(`Quadrique admettant une droite des centres (l'axe du cylindre),
surface réglée`);
if evalf(coeff(eq,X,2))=0 then
a:=1/sqrt(abs(coeff(eq,Y,2))): b:=1/sqrt(abs(coeff(eq,Z,2))):
print(`Axe du cylindre: (s,I)`):
param:=[X=lambda,Y=epsilon*a*cosh(theta),Z=b*sinh(theta)],theta=-infinity..infinity,lambda=-infinity..infinity,epsilon=±1:
surf:=plot3d([coord([lambda,a*cosh(theta),b*sinh(theta)],pt,P)],theta=-arcsinh(10/b)..arcsinh(10/b),lambda=-2..2),plot3d([coord([lambda,-a*cosh(theta),b*sinh(theta)],pt,P)],theta=-arcsinh(10/b)..arcsinh(10/b),lambda=-2..2):
elif evalf(coeff(eq,Y,2))=0 then
a:=1/sqrt(abs(coeff(eq,X,2))): b:=1/sqrt(abs(coeff(eq,Z,2))):
print(`Axe du cylindre: (s,J)`):
param:=[X=epsilon*a*cosh(theta),Y=lambda,Z=b*sinh(theta)],theta=-infinity..infinity,lambda=-infinity..infinity,epsilon=±1:
surf:=plot3d([coord([a*cosh(theta),lambda,b*sinh(theta)],pt,P)],theta=-arcsinh(10/b)..arcsinh(10/b),lambda=-2..2),plot3d([coord([-a*cosh(theta),lambda,b*sinh(theta)],pt,P)],theta=-arcsinh(10/b)..arcsinh(10/b),lambda=-2..2):
else
a:=1/sqrt(abs(coeff(eq,X,2))): b:=1/sqrt(abs(coeff(eq,Y,2))):
print(`Axe du cylindre: (s,K)`):
param:=[X=epsilon*a*cosh(theta),Y=b*sinh(theta),Z=lambda],theta=-infinity..infinity,lambda=-infinity..infinity,epsilon=±1:
surf:=plot3d([coord([a*cosh(theta),b*sinh(theta),lambda],pt,P)],theta=-arcsinh(10/b)..arcsinh(10/b),lambda=-2..2),plot3d([coord([-a*cosh(theta),b*sinh(theta),lambda],pt,P)],theta=-arcsinh(10/b)..arcsinh(10/b),lambda=-2..2):
end if:
print(`Paramétrage: `,param):
display({surf,axes(pt,P,-10,10)},labels=[x,y,z],axes=boxed,scaling=constrained)
end proc:
|
Procédure
elements_car_cyl_parab
Cette procédure donne les éléments caractéristiques d'un cylindre parabolique:
> |
elements_car_cyl_parab:=proc(eq,pt,P)
local e,a,param,surf:
print(`Quadrique sans centre, surface réglée`);
if evalf(coeff(eq,X,2))<>0 then
e:=isolate(eq,X^2):
if diff(rhs(e),Y)<>0 then a:=diff(rhs(e),Y):
param:=[X=lambda,Y=lambda^2/a,Z=mu],lambda=-infinity..infinity,mu=-infinity..infinity:
surf:=plot3d([coord([lambda,lambda^2/a,mu],pt,P)],lambda=-sqrt(abs(a)*10)..sqrt(abs(a)*10),mu=-5..5):
else a:=diff(rhs(e),Z):
param:=[X=lambda,Y=mu,Z=lambda^2/a],lambda=-infinity..infinity,mu=-infinity..infinity:
surf:=plot3d([coord([lambda,mu,lambda^2/a],pt,P)],lambda=-sqrt(abs(a)*10)..sqrt(abs(a)*10),mu=-5..5):
fi:
elif evalf(coeff(eq,Y,2))<>0 then
e:=isolate(eq,Y^2):
if diff(rhs(e),X)<>0 then a:=diff(rhs(e),X):
param:=[X=lambda^2/a,Y=lambda,Z=mu],lambda=-infinity..infinity,mu=-infinity..infinity:
surf:=plot3d([coord([lambda^2/a,lambda,mu],pt,P)],lambda=-sqrt(abs(a)*10)..sqrt(abs(a)*10),mu=-5..5):
else a:=diff(rhs(e),Z):
param:=[X=mu,Y=lambda,Z=lambda^2/a],lambda=-infinity..infinity,mu=-infinity..infinity:
surf:=plot3d([coord([mu,lambda,lambda^2/a],pt,P)],lambda=-sqrt(abs(a)*10)..sqrt(abs(a)*10),mu=-5..5):
fi:
else
e:=isolate(eq,Z^2):
if diff(rhs(e),X)<>0 then a:=diff(rhs(e),X):
param:=[X=lambda^2/a,Y=mu,Z=lambda],lambda=-infinity..infinity,mu=-infinity..infinity:
surf:=plot3d([coord([lambda^2/a,mu,lambda],pt,P)],lambda=-5..5,mu=-5..5):
else a:=diff(rhs(e),Y):
param:=[X=mu,Y=lambda^2/a,Z=lambda],lambda=-infinity..infinity,mu=-infinity..infinity:
surf:=plot3d([coord([mu,lambda^2/a,lambda],pt,P)],lambda=-5..5,mu=-5..5):
fi:
fi:
print(`Paramétrage: `,param):
display({surf,axes(pt,P,-10,10)},labels=[x,y,z],axes=boxed,scaling=constrained)
end proc:
|
Procédure
elements_car_parab_ ell
Cette procédure donne les éléments caractéristiques d'un paraboloïde elliptique:
> |
elements_parab_ell:=proc(eq,pt,P)
local a,b,c,param,surf:
print(`Quadrique sans centre, surface non réglée`);
if evalf(coeff(lhs(eq),X,2))=0 then
a:=1/sqrt(abs(coeff(lhs(eq),Y,2))): b:=1/sqrt(abs(coeff(lhs(eq),Z,2))):
c:=1/coeff(rhs(eq),X,1):
param:=[X=c*lambda^2,Y=a*lambda*cos(theta),Z=b*lambda*sin(theta)],theta=0..2*Pi,lambda=-infinity..infinity:
surf:=plot3d([coord([c*lambda^2,a*lambda*cos(theta),b*lambda*sin(theta)],pt,P)],theta=0..2*Pi,lambda=-sqrt(10/abs(c))..sqrt(10/abs(c)));
if a=b then print(`Paraboloïde de révolution d'axe (s,I)`) fi
elif evalf(coeff(lhs(eq),Y,2))=0 then
a:=1/sqrt(abs(coeff(lhs(eq),X,2))): b:=1/sqrt(abs(coeff(lhs(eq),Z,2))):
c:=1/coeff(rhs(eq),Y,1):
param:=[X=a*lambda*cos(theta),Y=c*lambda^2,Z=b*lambda*sin(theta)],theta=0..2*Pi,lambda=-infinity..infinity:
surf:=plot3d([coord([a*lambda*cos(theta),c*lambda^2,b*lambda*sin(theta)],pt,P)],theta=0..2*Pi,lambda=-sqrt(10/abs(c))..sqrt(10/abs(c)));
if a=b then print(`Paraboloïde de révolution d'axe (s,J)`) fi
else
a:=1/sqrt(abs(coeff(lhs(eq),X,2))): b:=1/sqrt(abs(coeff(lhs(eq),Y,2))):
c:=1/coeff(rhs(eq),Z,1):
param:=[X=a*lambda*cos(theta),Y=b*lambda*sin(theta),Z=c*lambda^2],theta=0..2*Pi,lambda=-infinity..infinity:
surf:=plot3d([coord([a*lambda*cos(theta),b*lambda*sin(theta),c*lambda^2],pt,P)],theta=0..2*Pi,lambda=-sqrt(10/abs(c))..sqrt(10/abs(c)));
if a=b then print(`Paraboloïde de révolution d'axe (s,K)`) fi
fi:
print(`Paramétrage: `,param):
display({surf,axes(pt,P,-10,10)},labels=[x,y,z],axes=boxed,scaling=constrained)
end proc:
|
Procédure
elements_car_parab_ hyp
Cette procédure donne les éléments caractéristiques d'un paraboloïde
hyperbolique:
> |
elements_parab_hyp:=proc(eq,pt,P)
local a,b,c,param,surf:
print(`Quadrique sans centre, surface réglée`);
if evalf(coeff(lhs(eq),X,2))=0 then
a:=1/sqrt(abs(coeff(lhs(eq),Y,2))): b:=1/sqrt(abs(coeff(lhs(eq),Z,2))):
c:=1/coeff(rhs(eq),X,1):
param:=[X=c*lambda^2,Y=a*lambda*cosh(theta),Z=b*lambda*sinh(theta)],theta=-infinity..infinity,lambda=-infinity..infinity:
surf:=plot3d([coord([c*lambda^2,a*lambda*cosh(theta),b*lambda*sinh(theta)],pt,P)],theta=-2.5..2.5,lambda=-sqrt(10/abs(c))..sqrt(10/abs(c)));
elif evalf(coeff(lhs(eq),Y,2))=0 then
a:=1/sqrt(abs(coeff(lhs(eq),X,2))): b:=1/sqrt(abs(coeff(lhs(eq),Z,2))):
c:=1/coeff(rhs(eq),Y,1):
param:=[X=a*lambda*cosh(theta),Y=c*lambda^2,Z=b*lambda*sinh(theta)],theta=-infinity..infinity,lambda=-infinity..infinity:
surf:=plot3d([coord([a*lambda*cosh(theta),c*lambda^2,b*lambda*sinh(theta)],pt,P)],theta=-2.5..2.5,lambda=-sqrt(10/abs(c))..sqrt(10/abs(c)));
else
a:=1/sqrt(abs(coeff(lhs(eq),X,2))): b:=1/sqrt(abs(coeff(lhs(eq),Y,2))):
c:=1/coeff(rhs(eq),Z,1):
param:=[X=a*lambda*cosh(theta),Y=b*lambda*sinh(theta),Z=c*lambda^2],theta=-infinity..infinity,lambda=-infinity..infinity:
surf:=plot3d([coord([a*lambda*cosh(theta),b*lambda*sinh(theta),c*lambda^2],pt,P)],theta=-2.5..2.5,lambda=-sqrt(10/abs(c))..sqrt(10/abs(c)));
fi:
print(`Paramétrage: `,param):
display({surf,axes(pt,P,-10,10)},labels=[x,y,z],axes=boxed,scaling=constrained)
end proc:
|
Procédure zero_pas_vp
Traitement du cas où 0 n'est pas valeur propre de la matrice de la forme
quadratique associée:
> |
zero_pas_vp:=proc(eq,c,P)
local alpha,lambda,mu,nu,e;
alpha:=-subs(X=0,Y=0,Z=0,eq);
lambda:=coeff(eq,X,2): mu:=coeff(eq,Y,2): nu:=coeff(eq,Z,2):
if evalf(alpha)=0 then # cône du second degré
if evalf(lambda*mu)>0 and evalf(mu*nu)>0 then print(`Quadrique dégénérée,
réduite au point c.`)
else
print(`Cône elliptique (ou du second degré) de sommet c:`);
if evalf(lambda*mu)>0 then
if evalf(lambda)>0 then e:=lambda*X^2+mu*Y^2+nu*Z^2 else
e:=-lambda*X^2-mu*Y^2-nu*Z^2 fi
elif evalf(lambda*nu)>0 then
if evalf(lambda)>0 then e:=lambda*X^2+mu*Y^2+nu*Z^2 else
e:=-lambda*X^2-mu*Y^2-nu*Z^2 fi
else
if evalf(mu)>0 then e:=lambda*X^2+mu*Y^2+nu*Z^2 else
e:=-lambda*X^2-mu*Y^2-nu*Z^2
fi:
print(e=0); elements_car_cone_elliptique(e,c,P)
fi
fi
else # alpha<>0
if evalf(lambda*mu)>0 and evalf(mu*nu)>0 then
if evalf(alpha/lambda)<0 then print(`Quadrique dégénérée: ensemble
vide`)
else print(`Ellipsoïde de centre c`):
e:=X^2/(alpha/lambda)+Y^2/(alpha/mu)+Z^2/(alpha/nu): print(e=1):
elements_car_ellipsoide(e,c,P)
fi
else
if evalf(lambda*mu)>0 then
if evalf(alpha/lambda)>0 then
print(`Hyperboloïde à une nappe de centre c`):
e:=X^2/(alpha/lambda)+Y^2/(alpha/mu)+Z^2/(alpha/nu): print(e=1):
elements_car_hyp1(e,c,P)
else print(`Hyperboloïde à deux nappes de centre c`):
e:=X^2/(-alpha/lambda)+Y^2/(-alpha/mu)-Z^2/(alpha/nu): print(e=-1):
elements_car_hyp2(e,c,P)
fi
elif evalf(lambda*nu)>0 then
if evalf(alpha/lambda)>0 then
print(`Hyperboloïde à une nappe de centre c`):
e:=X^2/(alpha/lambda)+Y^2/(alpha/mu)+Z^2/(alpha/nu): print(e=1):
elements_car_hyp1(e,c,P)
else print(`Hyperboloïde à deux nappes de centre c`):
e:=X^2/(-alpha/lambda)-Y^2/(alpha/mu)-Z^2/(alpha/nu): print(e=-1):
elements_car_hyp2(e,c,P)
fi
else
if evalf(mu*nu)>0 then
if evalf(alpha/mu)>0 then
print(`Hyperboloïde à une nappe de centre c`):
e:=X^2/(alpha/lambda)+Y^2/(alpha/mu)+Z^2/(alpha/nu): print(e=1):
elements_car_hyp1(e,c,P)
else print(`Hyperboloïde à deux nappes de centre c`):
e:=X^2/(-alpha/lambda)+Y^2/(-alpha/mu)+Z^2/(-alpha/nu):
print(e=-1):
elements_car_hyp2(e,c,P)
fi
fi
fi
fi
fi
end proc:
|
Procédure zero_vp_ simple
Traitement du cas où 0 est une valeur propre simple de la matrice de la forme
quadratique associée:
> |
zero_vp_simple:=proc(eq,P)
local c1,d1,e,e1,s,alpha,lambda,mu,nu;
alpha:=-subs(X=0,Y=0,Z=0,eq);
lambda:=coeff(eq,X,2): mu:=coeff(eq,Y,2): nu:=coeff(eq,Z,2):
if evalf(lambda)=0 then c1:=coeff(eq,X)
elif evalf(mu)=0 then c1:=coeff(eq,Y)
else c1:=coeff(eq,Z) fi:
if c1=0 then
if evalf(lambda)=0 then s:=[0,solve(diff(eq,Y),Y),solve(diff(eq,Z),Z)]
elif evalf(mu)=0 then s:=[solve(diff(eq,X),X),0,solve(diff(eq,Z),Z)]
else s:=[solve(diff(eq,X),X),solve(diff(eq,Y),Y),0] fi:
print(`nouvelle origine de coordonnées dans [o,I,J,K]:
s`=map(simplify,s));
e:=nouvelle_equation(subs(X=x,Y=y,Z=z,eq),s,diag(1,1,1),[x,y,z]):
print(`équation dans (s,I,J,K):`);
print(e(X,Y,Z)=0);
alpha:=-subs(X=0,Y=0,Z=0,e(X,Y,Z));
if evalf(alpha)=0 then
if evalf(nu)=0 then
if evalf(lambda*mu)>0 then print(`Quadrique dégénérée: droite (c,K)`):
print(`X=Y=0`)
else print(`Quadrique dégénérée: réunion de 2 plans`):
print(Y=-sqrt(-lambda/mu)*X,Y=sqrt(-lambda/mu)*X);
fi
elif evalf(mu)=0 then
if evalf(lambda*nu)>0 then print(`Quadrique dégénérée: droite (c,J)`):
print(`X=Z=0`)
else print(`Quadrique dégénérée: réunion de 2 plans`):
print(Z=-sqrt(-lambda/nu)*X,Z=sqrt(-lambda/nu)*X);
fi
else # evalf(lambda)=0 then
if evalf(mu*nu)>0 then print(`Quadrique dégénérée: droite (c,I)`):
print(`Y=Z=0`)
else print(`Quadrique dégénérée: réunion de 2 plans`):
print(Z=-sqrt(-mu/nu)*Y,Z=sqrt(-mu/nu)*Y);
fi
fi
else # alpha<>0
if evalf(nu)=0 then
if evalf(alpha/lambda)<0 and evalf(alpha/mu)<0 then print(`Quadrique
dégénérée: ensemble vide`)
elif evalf(alpha/lambda)>0 and evalf(alpha/mu)>0 then print(`Cylindre
elliptique`):
e:=X^2/(alpha/lambda)+Y^2/(alpha/mu): print(e=1):
elements_car_cyl_ell(e,s,P):
else print(`Cylindre hyperbolique`):
if evalf(alpha/lambda)>0 then
e:=X^2/(alpha/lambda)+Y^2/(alpha/mu) else
e:=Y^2/(alpha/mu)+X^2/(alpha/lambda) fi:
print(e=1): elements_car_cyl_hyp(e,s,P):
fi
elif evalf(mu)=0 then
if evalf(alpha/lambda)<0 and evalf(alpha/nu)<0 then print(`Quadrique
dégénérée: ensemble vide`)
elif evalf(alpha/lambda)>0 and evalf(alpha/nu)>0 then print(`Cylindre
elliptique`):
e:=X^2/(alpha/lambda)+Z^2/(alpha/nu)=1: print(e=1):
elements_car_cyl_ell(e,s,P):
else print(`Cylindre hyperbolique`):
if evalf(alpha/lambda)>0 then
e:=X^2/(alpha/lambda)+Z^2/(alpha/nu) else
e:=Z^2/(alpha/nu)+X^2/(alpha/lambda) fi:
print(e=1): elements_car_cyl_hyp(e,s,P)
fi
else
if evalf(alpha/mu)<0 and evalf(alpha/nu)<0 then print(`Quadrique
dégénérée: ensemble vide`)
elif evalf(alpha/mu)>0 and evalf(alpha/nu)>0 then print(`Cylindre
elliptique`):
e:=Y^2/(alpha/mu)+Z^2/(alpha/nu): print(e=1):
elements_car_cyl_ell(e,s,P):
else print(`Cylindre hyperbolique`):
if evalf(alpha/mu)>0 then e:=Y^2/(alpha/mu)+Z^2/(alpha/nu) else
e:=Z^2/(alpha/nu)+Y^2/(alpha/mu) fi: print(e=1):
elements_car_cyl_hyp(e,s,P)
fi
fi
fi
else # c1 non nul
if evalf(lambda)=0 then s:=[0,solve(diff(eq,Y),Y),solve(diff(eq,Z),Z)]
elif evalf(mu)=0 then s:=[solve(diff(eq,X),X),0,solve(diff(eq,Z),Z)]
else s:=[solve(diff(eq,X),X),solve(diff(eq,Y),Y),0] fi:
e1:=nouvelle_equation(subs(X=x,Y=y,Z=z,eq),s,diag(1,1,1),[x,y,z]):
if evalf(lambda)=0 then s[1]:=solve(subs(Y=0,Z=0,e1(X,Y,Z)),X)
elif evalf(mu)=0 then s[2]:=solve(subs(X=0,Z=0,e1(X,Y,Z)),Y)
else s[3]:=solve(subs(X=0,Y=0,e1(X,Y,Z)),Z) fi:
print(`nouvelle origine de coordonnées dans [o,I,J,K]:
s`=map(simplify,s));
e:=nouvelle_equation(subs(X=x,Y=y,Z=z,eq),s,diag(1,1,1),[x,y,z]):
print(`équation dans (s,I,J,K):`);
print(e(X,Y,Z)=0);
e1:=["",0]:
if evalf(nu)=0 then
if evalf(lambda*mu)>0 then
print(`Paraboloïde elliptique`); e1[1]:="ell":
else print(`Paraboloïde hyperbolique`): e1[1]:="hyp" fi;
if evalf(lambda)>0 then e1[2]:=lambda*X^2+mu*Y^2=-coeff(e(X,Y,Z),Z)*Z
else
e1[2]:=-lambda*X^2-mu*Y^2=coeff(e(X,Y,Z),Z)*Z fi:
elif evalf(mu)=0 then
if evalf(lambda*nu)>0 then
print(`Paraboloïde elliptique`); e1[1]:="ell":
else print(`Paraboloïde hyperbolique`): e1[1]:="hyp" fi;
if evalf(lambda)>0 then e1[2]:=lambda*X^2+nu*Z^2=-coeff(e(X,Y,Z),Y)*Y
else
e1[2]:=-lambda*X^2-nu*Z^2=coeff(e(X,Y,Z),Y)*Y fi
else
if evalf(mu*nu)>0 then
print(`Paraboloïde elliptique`); e1[1]:="ell":
else print(`Paraboloïde hyperbolique`): e1[1]:="hyp" fi;
if evalf(mu)>0 then e1[2]:=mu*Y^2+nu*Z^2=-coeff(e(X,Y,Z),X)*X else
e1[2]:=-mu*Y^2-nu*Z^2=coeff(e(X,Y,Z),X)*X fi
fi:
print(e1[2]);
if e1[1]="ell" then elements_parab_ell(e1[2],s,P) else
elements_parab_hyp(e1[2],s,P) fi;
fi
end proc:
|
Procédure zero_vp_double
Traitement du cas où 0 est une valeur propre double de la matrice de la forme
quadratique associée:
> |
zero_vp_double:=proc(eq,P)
local e,s,b1,c1,e1,t,alpha,beta,gamma,lambda,mu,nu,sys,sol,X1,Y1,Z1,U,V,W;
lambda:=coeff(eq,X,2): mu:=coeff(eq,Y,2): nu:=coeff(eq,Z,2):
if lambda<>0 then s:=[solve(diff(eq,X),X),0,0]
elif mu<>0 then s:=[0,solve(diff(eq,Y),Y),0]
else s:=[0,0,solve(diff(eq,Z),Z)] fi:
print(`nouvelle origine de coordonnées dans [o,I,J,K]:
s`=map(simplify,s));
e:=nouvelle_equation(subs(X=x,Y=y,Z=z,eq),s,diag(1,1,1),[x,y,z]):
print(`équation dans (s,I,J,K):`);
print(e(X,Y,Z)=0);
if evalm(lambda)<>0 then b1:=coeff(e(X,Y,Z),Y): c1:=coeff(e(X,Y,Z),Z)
elif evalm(mu)<>0 then b1:=coeff(e(X,Y,Z),X): c1:=coeff(e(X,Y,Z),Z)
else b1:=coeff(e(X,Y,Z),X):c1:=coeff(e(X,Y,Z),Y) fi:
if b1=0 and c1=0 then
if evalm(lambda)<>0 then e1:=isolate(e(X,Y,Z),X^2)
elif evalm(mu)<>0 then e1:=isolate(e(X,Y,Z),Y^2)
else e1:=isolate(e(X,Y,Z),Z^2)
fi:
print(e1);
if evalf(rhs(e1))<0 then print(`Quadrique dégénérée: ensemble vide`)
elif evalf(rhs(e1))=0 then print(`Quadrique dégénérée. Plan d'équation:`):
if evalm(lambda)<>0 then print(X=0)
elif evalm(mu)<>0 then print(Y=0) else print(Z=0) fi:
else print(`Quadrique dégénérée. Réunion de 2 plans d'équation:`):
if evalm(lambda)<>0 then print(X=-sqrt(rhs(e1)),X=sqrt(rhs(e1)))
elif evalm(mu)<>0 then print(Y=-sqrt(rhs(e1)),Y=sqrt(rhs(e1))) else
print(Z=-sqrt(rhs(e1)),Z=sqrt(rhs(e1))) fi:
fi
else #b1<>0 ou c1<>0
if evalm(lambda)<>0 then
sys:={X1=0,b1*Y1+c1*Z1=0,X1^2+Y1^2+Z1^2=1}:
U:=vector([1,0,0]):
sol:=solve(sys,{X1,Y1,Z1}); assign(sol):
W:=vector([X1,Y1,Z1]); V:=crossprod(W,U):
elif evalm(mu)<>0 then
sys:={Y1=0,b1*X1+c1*Z1=0,X1^2+Y1^2+Z1^2=1}:
V:=vector([0,1,0]):
sol:=solve(sys,{X1,Y1,Z1}); assign(sol):
U:=vector([X1,Y1,Z1]); W:=crossprod(U,V):
else
sys:={Z1=0,b1*Y1+c1*Z1=0,X1^2+Y1^2+Z1^2=1}:
W:=vector([0,0,1]):
sol:=solve(sys,{X1,Y1,Z1}); assign(sol):
V:=vector([X1,Y1,Z1]); U:=crossprod(V,W):
fi:
print(`changement de base (coordonnées dans (I,J,K))`):
print(` U`=evalm(U),` V`=evalm(V),` W`=evalm(W));
e1:=nouvelle_equation(e(x,y,z),[0,0,0],concat(U,V,W),[x,y,z]);
print(`équation dans (s,U,V,W):`);
print(e1(X,Y,Z)=0);
if evalm(lambda)<>0 then
alpha:=coeff(e1(X,Y,Z),Y,1): beta:=subs(X=0,Y=0,Z=0,e1(X,Y,Z)):
gamma:=-beta/alpha; t:=[0,gamma,0];
elif evalm(mu)<>0 then
alpha:=coeff(e1(X,Y,Z),Z,1): beta:=subs(X=0,Y=0,Z=0,e1(X,Y,Z)):
gamma:=-beta/alpha; t:=[0,0,gamma];
else
alpha:=coeff(e1(X,Y,Z),X,1): beta:=subs(X=0,Y=0,Z=0,e1(X,Y,Z)):
gamma:=-beta/alpha; t:=[gamma,0,0];
fi:
print(`nouvelle origine de coordonnées dans [s,U,V,W]: t`=t):
print(`Cylindre parabolique`);
print(`équation dans (t,U,V,W):`);
e:=nouvelle_equation(e1(x,y,z),t,diag(1,1,1),[x,y,z]):
print(e(X,Y,Z)=0);
elements_car_cyl_parab(e(X,Y,Z),t,P):
fi
end proc:
|
Procédure quadrique
C'est la procédure principale de cette feuille de calcul. Elle reçoit en
paramètres une expression
expr
des variables
var
.
Elle extrait la forme quadratique
q
associée à
expr
, réduit sa matrice, calcule une base [I,J,K] de
orthonormale et qui est aussi
q
-orthogonale,
analyse la nature de la quadrique et donne ses éléments caractéristiques, ainsi
que sa représentation graphique
> |
quadrique:=proc(expr,var)
local e,k,q,v,A,D,G,P,c,eq,vp,ker,s;
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²+By²+Cz²+2Dxy+2Eyz+2Fzx+Gx+Hy+Iz+J"
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..3)],i=1..3)]);
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..3)]));
P:=map(simplify,concat(op(G)));
print(`Matrice de passage orthogonale: P`=evalm(P));
print(`Directions principales de la quadrique:`);
print(`I `=col(P,1),` J `=col(P,2), ` K `=col(P,3));
if det(D)<>0 then
c:=centre(expr,var): print(`Quadrique à centre: c`=c):
print(`Equation dans (c,I,J,K): `):
eq:=nouvelle_equation(f,c,P,var):
print(collect(eq(X,Y,Z),[X,Y,Z])=0):
zero_pas_vp(eq(X,Y,Z),c,P)
else # det(D)=0
print(`Equation dans (o,I,J,K): `):
eq:=nouvelle_equation(f,[0,0,0],P,var):
print(eq(X,Y,Z)=0);
ker:=nullspace(D);
if nops(ker)=1 then # 0 valeur propre simple
zero_vp_simple(eq(X,Y,Z),P)
else
if nops(ker)=2 then # 0 valeur propre double
zero_vp_double(eq(X,Y,Z),P)
fi
fi
fi
end:
|
Exemple 1: Affichage d'un
message d'erreur
> |
f:=x^4+y^4+z^4-2*x*y+2*x*z+3*x-y+z+1; quadrique(f,[x,y,z]);
|
Error, (in quadrique) Cette expression ne correspond pas à la forme attendue: Ax²+By²+Cz²+2Dxy+2Eyz+2Fzx+Gx+Hy+Iz+J
Exemple 2: Un cas de
dégénérescence
> |
f:=-2*x^2+4*x*y-4*x*z-2*y^2+4*y*z-2*z^2+4*x-4*y+4*z+7; quadrique(f,[x,y,z]);
|
Exemple 3: Hyperboloïde à
deux nappes
> |
f:=x^2+y^2+z^2-2*x*y+2*x*z+3*x-y+z+1; quadrique(f,[x,y,z]);
|
Exemple 4: Cylindre
elliptique
> |
f:=x^2+2*y^2+z^2-2*y*z+2*x*y-2*x+2*y-4*z+4; quadrique(f,[x,y,z]);
|
Exemple 5: Hyperboloïde à
une nappe
> |
f:=x*y+y*z+x*z+2*y+1;
quadrique(f,[x,y,z]); |
Exemple 6: Cône elliptique
> |
f:=x^2-10*x-20-y^2+14*y+9*z^2-12*z; quadrique(f,[x,y,z]); |
Exemple 7: Ellipsoïde
> |
f:=-2*x^2-4*x-75-4*y^2-10*y-3*z^2+30*z; quadrique(f,[x,y,z]);
|
Exemple 8: Cylindre
hyperbolique
> |
f:=-x^2-x+y^2-2*y-z^2-z-2*x*z; quadrique(f,[x,y,z]);
|
Exemple 9: Paraboloïde
elliptique
> |
f:=4*x^2-12*x+12+3*y^2-12*y-9*z; quadrique(f,[x,y,z]);
|
Exemple 10: Paraboloïde
hyperbolique
> |
f:=-4*x^2-4*x+5*y+4*z^2+8*z-7; quadrique(f,[x,y,z]);
|
Exemple 11: Cylindre
parabolique
> |
f:=-2*x^2+4*x*y-4*x*z-2*y^2+4*y*z-2*z^2+4*x-5*y+6*z-11;
quadrique(f,[x,y,z]); |
|