# Podle knihy PLOCHY 2. STUPNE, Pavel Pech zpracoval Marek Dvoroznak
# Verze 1.0
# Priklady z knihy PLOCHY 2. STUPNE, Pavel Pech, strana 54, cviceni 3
# a - stredova regularni - dvojdilny hyperboloid
# b - nestredova regularni - elipticky paraboloid
# c - nestredova singularni - parabolicka valcova plocha
# d - nestredova singularni - primka
# e - stredova regularni - trojosy elipsoid
# f - stredova singularni - kuzelova plocha
# g - nestredova regularni - hyperbolicky paraboloid
# h - stredova regularni - trojosy elipsoid
# i - nestredova singularni - dve rovnobezne roviny
# j - nestredova singularni - elipticka valcova plocha
# k - nestredova singularni - hyperbolicka valcova plocha
# l - stredova regularni - imaginarni elipsoid
# m - nestredova singularni - valcova plocha
# n - nestredova singularni - dvojnasobna rovina
# o - nestredova singularni - hyperbolicka valcova plocha
# p - stredova regularni - rotacni dvojdilny hyperboloid
# q - nestredova regularni - hyperbolicky paraboloid
# r - stredova singularni - kuzelova plocha
# s - nestredova regularni - elipticky paraboloid
# Dalsi priklady
# t - stredova regularni - zplostely rotacni elipsoid
# u - nestredova singularni - dve ruznobezne roviny
# v - stredova regularni - kulova plocha
# w - nestredova singularni - imaginarni rovnobezne roviny
# x - stredova regularni - jednodilny hyperboloid
# y - stredova singularni - bod (imaginarni kuzelova plocha)
# z - nestredova singularni - imaginarni elipticka valcova plocha
# 1 - stredova regularni - jednodilny hyperboloid
restart;
with(linalg):
with(Maplets[Elements]):
with(MathML):
with(XMLTools):
with(plots):
defaultSize:=5:
presnost:=3:
kvalita1:=10: # hlavni roviny
kvalita2:=25: # ostatni
zapnoutNumerickeVypocty:=0:
# ZACATEK POMOCNYCH PROCEDUR
extrakceKoeficientu:=proc(rceKvadriky)
global a11,a22,a33,a12,a13,a23,a14,a24,a34,a44;
local koeficient, i, rce;
rce:=rceKvadriky;
# zkusime, zda je zadana rovnice a zareagujeme na to
if type(rceKvadriky, `equation`) = true then
rce:=lhs(rce)-rhs(rce);
end if;
a11:=coeff(rce,x,2);
a22:=coeff(rce,y,2);
a33:=coeff(rce,z,2);
a12:=coeff(coeff(rce,x),y)/2;
a13:=coeff(coeff(rce,x),z)/2;
a23:=coeff(coeff(rce,y),z)/2;
a14:=coeff(coeff(coeff(rce,x),y,0),z,0)/2;
a24:=coeff(coeff(coeff(rce,y),x,0),z,0)/2;
a34:=coeff(coeff(coeff(rce,z),x,0),y,0)/2;
a44:=rce-(a11*x^2+a22*y^2+a33*z^2+2*a12*x*y+2*a13*x*z+2*a23*y*z+2*a14*x+2*a24*y+2*a34*z);
if evalf(a11) = 0 and evalf(a12) = 0 and evalf(a13) = 0 and evalf(a22) = 0 and evalf(a23) = 0 and evalf(a33) = 0 then
# chyba - alespon jeden z techto koeficientu se nesmi rovnat nule
error "COEFNULL";
end if;
for i in [a11, a22, a33, a12, a13, a23, a14, a24, a34, a44] do
if type(evalf(i),realcons) = false then
error "COEFNOTREAL";
end if;
end do;
end proc:
znamenko:=proc(cislo, zacatek)
if signum(cislo) = -1 then return "-"; elif zacatek = false then return "+"; end if;
end proc:
dalsiKrok:=proc()
global aktualniKrok;
local rce;
try
rce:=Maplets:-Tools:-Get('rceKvadriky'('value'));
if StringTools[Trim](rce) = "" then
error "NOEQ";
end if;
Maplets:-Tools:-Set('btnMain'('enabled') = 'false');
Maplets:-Tools:-Set('rceKvadriky'('value') = expand(parse(rce)));
reinit(parse(Maplets:-Tools:-Get('rceKvadriky'('value'))));
Maplets:-Tools:-Set('btnNew'('enabled') = 'true');
Maplets:-Tools:-Set('btnMain'('caption') = "Dalsi krok");
Maplets:-Tools:-Set('btnChoose'('enabled') = 'false');
Maplets:-Tools:-Set('ChB1'('enabled') = 'true');
Maplets:-Tools:-Set('ChB2'('enabled') = 'true');
Maplets:-Tools:-Set('ChB3'('enabled') = 'true');
Maplets:-Tools:-Set('ChB4'('enabled') = 'true');
Maplets:-Tools:-Set('ChB5'('enabled') = 'true');
Maplets:-Tools:-Set('zoom'('visible') = 'true');
Maplets:-Tools:-Set('rceKvadriky'('editable') = 'false');
Maplets:-Tools:-Set('MMLViewer'('value') = postup(aktualniKrok));
Maplets:-Tools:-Set('btnMain'('enabled') = 'true');
if (aktualniKrok >= 17) then
Maplets:-Tools:-Set('btnMain'('enabled') = 'false');
else
aktualniKrok:=aktualniKrok+1;
end if;
catch "COEFNULL":
Maplets:-Tools:-Set('btnMain'('enabled') = 'true');
error "Alespon jeden z koeficientu a11, a12, a13, a22, a23, a33 zadane rovnice musi byt nenulovy.";
catch "COEFNOTREAL":
Maplets:-Tools:-Set('btnMain'('enabled') = 'true');
error "Zadana rovnice musi byt ve tvaru a11*x^2+a22*y^2+a33*z^2+2*a12*x*y+2*a13*x*z+2*a23*y*z+2*a14*x+2*a24*y+2*a34*z+a44=0 a koeficienty zadane rovnice musi byt realne.";
catch "NOEQ":
Maplets:-Tools:-Set('btnMain'('enabled') = 'true');
error "Nejdrive zadejte obecnou rovnici kvadriky.";
catch :
Maplets:-Tools:-Set('btnMain'('enabled') = 'true');
error lasterror;
end try;
end proc:
getReference:=proc(nazev)
global reference;
local i, j;
j:=0;
for i in reference do
j:=j+1;
if i = nazev then return j; end if;
end do;
end proc:
setReference:=proc(nazev)
global reference;
reference:=[op(reference), nazev];
return nops(reference);
end proc:
# KONEC POMOCNYCH PROCEDUR
# ZACATEK PROCEDUR PRO DEFINICI MATHML VYPISU
definiceMMLVypisu:=proc()
global a11, a12, a13, a14, a21, a22, a23, a24, a31, a32, a33, a34, a41, a42, a43, a44,
delta, charRce, rozepsanaCharRce, hlavniRovina1, hlavniRovina2, hlavniRovina3,
deltaMML, A44MML, charRceMML, rozepsanaCharRceMML, rozlozenaCharRceMML, reseniCharRceMML, vlastniVektorySoustavaMML, uMML,
lambdaPodminkyMML, nestredovaRegularniNeupravenyKanonickyTvarMML, e2MML, e3MML, GMML, FMML,
delkyPoloosMML, stredovaNeupravenyKanonickyTvarMML, neupravenyKanonickyTvarDosazenoMML,
deltaA44MML, minusNeupravenyKanonickyTvarDosazenoMML, kanonickaRceMML, stredSoustavaMML, NMML,
nestredovaNeupravenyKanonickyTvar1MML, nestredovaNeupravenyKanonickyTvar2MML, nestredovaNeupravenyKanonickyTvar3MML, nestredovaNeupravenyKanonickyTvar4MML,
osaStreduKvadrikyMML, rovinaStreduKvadrikyMML, bodMMML, SMML, vztahProZiskaniHlavnichRovinMML,
vztahProZiskaniHlavnichRovinDosazenoMML, hlavniRovina1MML, hlavniRovina2MML, hlavniRovina3MML, osaMML, VMML, rezRovKMML, rezRovKvRMML,
rezRovK2MML;
local stredeqns, osa, K_, delta_, A44_, rozepsanaCharRce_, lambda1_, lambda2_, lambda3_, r1_, r2_, r3_, bodyOsy_, bodyRoviny_,
puvodniNeupravenaKanonickaRce_, neupravenaKanonickaRce_, e2_, e3_, F_, G_, S_, V_, M_, N_, kanonickaRce_, a_, b_, c_, hlavniRovina1_, hlavniRovina2_, hlavniRovina3_;
if zapnoutNumerickeVypocty = 1 then
Digits:=presnost;
K_:=evalf(evalm(K));delta_:=evalf(delta);A44_:=evalf(A44);
rozepsanaCharRce_:=evalf(rozepsanaCharRce);
lambda1_:=evalf(lambda1);lambda2_:=evalf(lambda2);lambda3_:=evalf(lambda3);
r1_:=evalf(r1);r2_:=evalf(r2);r3_:=evalf(r3);
bodyOsy_:=evalf(bodyOsy);bodyRoviny_:=evalf(bodyRoviny);
puvodniNeupravenaKanonickaRce_:=evalf(puvodniNeupravenaKanonickaRce);
neupravenaKanonickaRce_:=evalf(neupravenaKanonickaRce);
e2_:=evalf(evalm(e2));e3_:=evalf(evalm(e3));F_:=evalf(F);G_:=evalf(G);S_:=evalf(S);V_:=evalf(V);M_:=evalf(M);N_:=evalf(N);
kanonickaRce_:=evalf(kanonickaRce);a_:=evalf(a);b_:=evalf(b);c_:=evalf(c);
hlavniRovina1_:=evalf(hlavniRovina1);hlavniRovina2_:=evalf(hlavniRovina2);hlavniRovina3_:=evalf(hlavniRovina3);
vlastniVektorySoustavaMML:=proc(lambda)
Digits:=presnost;
return cat("", PrintToString(FirstChild(ParseString(ExportPresentation(evalf(r1(lambda)))))), "", PrintToString(FirstChild(ParseString(ExportPresentation(evalf(r2(lambda)))))), "", PrintToString(FirstChild(ParseString(ExportPresentation(evalf(r3(lambda)))))), "");
end proc;
vztahProZiskaniHlavnichRovinDosazenoMML:=proc(u)
Digits:=presnost;
return cat(PrintToString(FirstChild(ParseString(ExportPresentation(matrix(1,4,[evalf(u[1]),evalf(u[2]),evalf(u[3]),0])*`K`*matrix(4,1,[x,y,z,1])=0)))));
end proc;
uMML:=proc(vektor, cislo)
Digits:=presnost;
return cat("u", cislo,"=", PrintToString(FirstChild(ParseString(ExportPresentation(evalf(vektor))))));
end proc;
rezRovKMML:=proc(cislo)
Digits:=presnost;
return cat("k>",PrintToString(FirstChild(ParseString(ExportPresentation(evalf(cislo))))));
end proc;
rezRovK2MML:=proc(cislo,operator)
Digits:=presnost;
return cat("k", operator,"",PrintToString(FirstChild(ParseString(ExportPresentation(evalf(cislo))))));
end proc;
osa:=proc(c1,c2)
Digits:=presnost;
return eval([x,y,z],evalf(solve({eval(cat(`hlavniRovina`,c1)),eval(cat(`hlavniRovina`,c2))},{x,y,z})));
end proc;
else
K_:=evalm(K);delta_:=delta;A44_:=A44;
rozepsanaCharRce_:=rozepsanaCharRce;
lambda1_:=lambda1;lambda2_:=lambda2;lambda3_:=lambda3;
r1_:=r1;r2_:=r2;r3_:=r3;
bodyOsy_:=bodyOsy;bodyRoviny_:=bodyRoviny;
puvodniNeupravenaKanonickaRce_:=puvodniNeupravenaKanonickaRce;
neupravenaKanonickaRce_:=neupravenaKanonickaRce;
e2_:=e2;e3_:=e3;F_:=F;G_:=G;S_:=S;V_:=V;M_:=M;N_:=N;
kanonickaRce_:=kanonickaRce;a_:=a;b_:=b;c_:=c;
hlavniRovina1_:=hlavniRovina1;hlavniRovina2_:=hlavniRovina2;hlavniRovina3_:=hlavniRovina3;
vlastniVektorySoustavaMML:=lambda->cat("", PrintToString(FirstChild(ParseString(ExportPresentation(r1(lambda))))), "", PrintToString(FirstChild(ParseString(ExportPresentation(r2(lambda))))), "", PrintToString(FirstChild(ParseString(ExportPresentation(r3(lambda))))), "");
vztahProZiskaniHlavnichRovinDosazenoMML:=u->cat(PrintToString(FirstChild(ParseString(ExportPresentation(matrix(1,4,[u[1],u[2],u[3],0])*`K`*matrix(4,1,[x,y,z,1])=0)))));
uMML:=(vektor, cislo)->cat("u", cislo,"=", PrintToString(FirstChild(ParseString(ExportPresentation(vektor)))));
rezRovKMML:=cislo->cat("k>",PrintToString(FirstChild(ParseString(ExportPresentation(cislo)))));
rezRovK2MML:=(cislo,operator)->cat("k", operator,"",PrintToString(FirstChild(ParseString(ExportPresentation(cislo)))));
osa:=(c1,c2)->eval([x,y,z],solve({eval(cat(`hlavniRovina`,c1)),eval(cat(`hlavniRovina`,c2))},{x,y,z}));
end if;
deltaMML:=cat("Δ=|", PrintToString(FirstChild(FirstChild(ParseString(ExportPresentation(evalm(K_)))))), "|=", PrintToString(FirstChild(ParseString(ExportPresentation(delta_)))));
A44MML:=cat("A44=|", PrintToString(FirstChild(FirstChild(ParseString(ExportPresentation(evalm(submatrix(K_,1..3,1..3))))))), "|=", PrintToString(FirstChild(ParseString(ExportPresentation(A44_)))));
charRceMML:=cat("|", PrintToString(FirstChild(FirstChild(ParseString(ExportPresentation(evalm(submatrix(K_,1..3,1..3)-lambda)))))), "|=0");
rozepsanaCharRceMML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(rozepsanaCharRce_)))), "=0");
rozlozenaCharRceMML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(factor(rozepsanaCharRce_))))), "=0");
reseniCharRceMML:=cat("λ1=", PrintToString(FirstChild(ParseString(ExportPresentation(lambda1_)))), ",",
"λ2=", PrintToString(FirstChild(ParseString(ExportPresentation(lambda2_)))), ",",
"λ3=", PrintToString(FirstChild(ParseString(ExportPresentation(lambda3_)))));
stredeqns:=geneqns(submatrix(K_,1..3,1..3),[x,y,z],evalm(-1*subvector(K_,1..3,4)));
if nops(stredeqns) > 0 then
stredSoustavaMML:=cat("", PrintToString(FirstChild(ParseString(ExportPresentation(stredeqns[1])))), "");
if nops(stredeqns) > 1 then
stredSoustavaMML:=cat(stredSoustavaMML, "", PrintToString(FirstChild(ParseString(ExportPresentation(stredeqns[2])))), "");
end if;
if nops(stredeqns) = 3 then
stredSoustavaMML:=cat(stredSoustavaMML, "", PrintToString(FirstChild(ParseString(ExportPresentation(stredeqns[3])))), "");
end if;
stredSoustavaMML:=cat(stredSoustavaMML, "");
end if;
if (nops(bodyOsy) > 0) then
osaStreduKvadrikyMML:=cat("x=", PrintToString(FirstChild(ParseString(ExportPresentation(bodyOsy_[1])))), "",
"y=", PrintToString(FirstChild(ParseString(ExportPresentation(bodyOsy_[2])))), "",
"z=", PrintToString(FirstChild(ParseString(ExportPresentation(bodyOsy_[3])))), "");
end if;
if (nops(bodyRoviny) > 0) then
rovinaStreduKvadrikyMML:=cat("x=", PrintToString(FirstChild(ParseString(ExportPresentation(bodyRoviny_[1])))), "",
"y=", PrintToString(FirstChild(ParseString(ExportPresentation(bodyRoviny_[2])))), "",
"z=", PrintToString(FirstChild(ParseString(ExportPresentation(bodyRoviny_[3])))), "");
end if;
lambdaPodminkyMML:=(o1,o2,o3)->cat("λ1", o1,"0,",
"λ2", o2,"0,",
"λ3", o3,"0");
# nestredovaRegularniNeupravenyKanonickyTvarMML:="λ1⁢x2+λ2⁢y2+2⁢G⁢z+N=0";
nestredovaNeupravenyKanonickyTvar1MML:="λ1⁢x2+λ2⁢y2+2⁢G⁢z=0";
nestredovaNeupravenyKanonickyTvar2MML:="λ1⁢x2+λ2⁢y2+N=0";
nestredovaNeupravenyKanonickyTvar4MML:="λ1⁢x2+2⁢G⁢z+2⁢F⁢y=0";
nestredovaNeupravenyKanonickyTvar3MML:="λ1⁢x2+N=0";
neupravenyKanonickyTvarDosazenoMML:=PrintToString(FirstChild(ParseString(ExportPresentation(lhs(puvodniNeupravenaKanonickaRce_)-rhs(puvodniNeupravenaKanonickaRce_)=0))));
minusNeupravenyKanonickyTvarDosazenoMML:=PrintToString(FirstChild(ParseString(ExportPresentation(lhs(neupravenaKanonickaRce_)-rhs(neupravenaKanonickaRce_)=0))));
stredovaNeupravenyKanonickyTvarMML:="λ1⁢x2+λ2⁢y2+λ3⁢z2+ΔA44=0";
if (A44 <> 0) then
deltaA44MML:=cat("ΔA44=", PrintToString(FirstChild(ParseString(ExportPresentation(delta_/A44_)))));
end if;
e2MML:=cat("e2=u2|u2|=[", PrintToString(FirstChild(ParseString(ExportPresentation(e2_[1])))), ",", PrintToString(FirstChild(ParseString(ExportPresentation(e2_[2])))), ",", PrintToString(FirstChild(ParseString(ExportPresentation(e2_[3])))), "]");
e3MML:=cat("e3=u3|u3|=[", PrintToString(FirstChild(ParseString(ExportPresentation(e3_[1])))), ",", PrintToString(FirstChild(ParseString(ExportPresentation(e3_[2])))), ",", PrintToString(FirstChild(ParseString(ExportPresentation(e3_[3])))), "]");
FMML:=cat("F=a14⁢e21+a24⁢e22+a34⁢e23=", PrintToString(FirstChild(ParseString(ExportPresentation(F_)))));
GMML:=cat("G=a14⁢e31+a24⁢e32+a34⁢e33=", PrintToString(FirstChild(ParseString(ExportPresentation(G_)))));
SMML:=cat("S=", PrintToString(FirstChild(ParseString(ExportPresentation(S_)))));
VMML:=cat("V=", PrintToString(FirstChild(ParseString(ExportPresentation(V_)))));
bodMMML:=cat("M=", PrintToString(FirstChild(ParseString(ExportPresentation(M_)))));
NMML:=cat("N=", PrintToString(FirstChild(ParseString(ExportPresentation(N_)))));
kanonickaRceMML:=cat("", znamenko(coeff(lhs(kanonickaRce_),x,2), true),"x2", PrintToString(FirstChild(ParseString(ExportPresentation(a_^2)))),"");
if evalf(lambda2) <> 0 then
kanonickaRceMML:=cat(kanonickaRceMML, "", znamenko(coeff(lhs(kanonickaRce_),y,2), false),"y2", PrintToString(FirstChild(ParseString(ExportPresentation(b_^2)))),"");
end if;
if evalf(lambda3) <> 0 then
kanonickaRceMML:=cat(kanonickaRceMML, "", znamenko(coeff(lhs(kanonickaRce_),z,2), false),"z2", PrintToString(FirstChild(ParseString(ExportPresentation(c_^2)))),"");
end if;
kanonickaRceMML:=cat(kanonickaRceMML, "=", PrintToString(FirstChild(ParseString(ExportPresentation(rhs(kanonickaRce_))))));
# stredovaKanonickaRceMML:=cat("", znamenko(coeff(lhs(kanonickaRce),x,2), true),"x2", PrintToString(FirstChild(ParseString(ExportPresentation(a^2)))),"", znamenko(coeff(lhs(kanonickaRce),y,2), false),"y2", PrintToString(FirstChild(ParseString(ExportPresentation(b^2)))),"", znamenko(coeff(lhs(kanonickaRce),z,2), false),"z2", PrintToString(FirstChild(ParseString(ExportPresentation(c^2)))),"=", PrintToString(FirstChild(ParseString(ExportPresentation(rhs(kanonickaRce))))));
# stredovaRegularniKanonickaRceMML:=cat("x2", PrintToString(FirstChild(ParseString(ExportPresentation(a^2)))),"+y2", PrintToString(FirstChild(ParseString(ExportPresentation(b^2)))),"=", PrintToString(FirstChild(ParseString(ExportPresentation(rhs(kanonickaRce))))));
delkyPoloosMML:=cat("a2=", PrintToString(FirstChild(ParseString(ExportPresentation(a_^2)))), "⇒a=", PrintToString(FirstChild(ParseString(ExportPresentation(a_)))));
if zapnoutNumerickeVypocty = 0 then
delkyPoloosMML:=cat(delkyPoloosMML, "≅", PrintToString(FirstChild(ParseString(ExportPresentation(evalf[3](a))))));
end if;
delkyPoloosMML:=cat(delkyPoloosMML, "");
if evalf(lambda2) <> 0 then
delkyPoloosMML:=cat(delkyPoloosMML, "b2=", PrintToString(FirstChild(ParseString(ExportPresentation(b_^2)))), "⇒b=", PrintToString(FirstChild(ParseString(ExportPresentation(b_)))));
if zapnoutNumerickeVypocty = 0 then
delkyPoloosMML:=cat(delkyPoloosMML, "≅", PrintToString(FirstChild(ParseString(ExportPresentation(evalf[3](b))))));
end if;
delkyPoloosMML:=cat(delkyPoloosMML, "");
end if;
if evalf(lambda3) <> 0 then
delkyPoloosMML:=cat(delkyPoloosMML, "c2=", PrintToString(FirstChild(ParseString(ExportPresentation(c_^2)))), "⇒c=", PrintToString(FirstChild(ParseString(ExportPresentation(c_)))));
if zapnoutNumerickeVypocty = 0 then
delkyPoloosMML:=cat(delkyPoloosMML, "≅", PrintToString(FirstChild(ParseString(ExportPresentation(evalf[3](c))))));
end if;
delkyPoloosMML:=cat(delkyPoloosMML, "");
end if;
delkyPoloosMML:=cat(delkyPoloosMML, "");
vztahProZiskaniHlavnichRovinMML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(matrix(1,4,[`v`[1],`v`[2],`v`[3],0])*`K`*matrix(4,1,[x,y,z,1])=0)))));
if evalf(lambda1) <> 0 then
hlavniRovina1MML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(hlavniRovina1_=0)))));
end if;
if evalf(lambda2) <> 0 then
hlavniRovina2MML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(hlavniRovina2_=0)))));
end if;
if evalf(lambda3) <> 0 then
hlavniRovina3MML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(hlavniRovina3_=0)))));
end if;
osaMML:=(c1,c2)->cat("x=", PrintToString(FirstChild(ParseString(ExportPresentation(osa(c1,c2)[1])))), "", "y=", PrintToString(FirstChild(ParseString(ExportPresentation(osa(c1,c2)[2])))), "", "z=", PrintToString(FirstChild(ParseString(ExportPresentation(osa(c1,c2)[3])))), "");
rezRovKvRMML:="k∈ℝ";
end proc:
cislovaniMML:=proc(cislo)
return cat("", cislo, "");
end proc:
radekMML:=proc(mmltext)
return cat("", mmltext, "");
end proc:
celyMMLtext:="":
postup:=proc(krok)
global delta, A44, typKvadriky, lambda1, lambda2, lambda3, celyMMLtext, aktualniKrok, dosazenoVlastniVektor1, dosazenoVlastniVektor2, dosazenoVlastniVektor3;
local text, cislovani, hlavicka, paticka, MMLtext, rovnice, rezRov1, rezRov2;
hlavicka:="";
MMLtext:="";
if krok = 1 then
text:=cat("Vypocteme diskriminant (", setReference("delta"),"). Vychazi nam cislo, ktere je ");
if evalf(delta) <> 0 then text:=cat(text, "ruzne od nuly, jedna se tedy o regularni kvadriku.");
else text:=cat(text, "rovno nule, jedna se tedy o singularni kvadriku.");
end if;
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("delta")), deltaMML)));
end if;
if krok = 2 then
text:=cat("Vypocteme determinant A44 (", setReference("A44"),"). Vychazi nam cislo, ktere je ");
if evalf(A44) <> 0 then text:=cat(text, "ruzne od nuly, jedna se tedy o stredovou kvadriku.");
else text:=cat(text, "rovno nule, jedna se tedy o nestredovou kvadriku.");
end if;
text:=cat(text, " Kvadrika bude tedy ");
if typKvadriky = "Nestredova regularni" then text:=cat(text, "paraboloid"); end if;
if typKvadriky = "Nestredova singularni" then text:=cat(text, "valcova plocha (elipticka, imaginarni elipticka, hyperbolicka, parabolicka), primka nebo dve ruznobezne roviny, dve rovnobezne roviny nebo dve imaginarni rovnobezne roviny nebo dvojnasobna rovina."); end if;
if typKvadriky = "Stredova regularni" then text:=cat(text, "elipsoid nebo hyperboloid"); end if;
if typKvadriky = "Stredova singularni" then text:=cat(text, "bod (imaginarni kuzelova plocha) nebo kuzelova plocha"); end if;
text:=cat(text, ".");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("A44")), A44MML)));
end if;
if krok = 3 then
text:=cat("Urcime kanonickou rovnici a hlavni smery. Nejprve vypocitame koreny charakteristicke rovnice (", setReference("charRce"),"), ktera ma v rozepsanem stavu tvar (", setReference("charRceRozepsana"),")");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("charRce")), charRceMML)), radekMML(cat(cislovaniMML(getReference("charRceRozepsana")), rozepsanaCharRceMML)));
if rozepsanaCharRceMML <> rozlozenaCharRceMML then
text:=cat(text, ", tj. (", setReference("charRceRozlozena"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("charRceRozlozena")), rozlozenaCharRceMML)));
else
text:=cat(text, ".");
end if;
end if;
if krok = 4 then
text:=cat("Rovnici (", getReference("charRceRozepsana"),") vyresime a dostaneme vlastni cisla (", setReference("reseniCharRce"),"). ");
if typKvadriky = "Nestredova regularni" then
if nazevKvadriky = "hyperbolicky paraboloid" then
text:=cat(text, "Nenulova vlastni cisla maji ruzna znamenka, proto se jedna o hyperbolicky paraboloid.");
else
text:=cat(text, "Nenulova vlastni cisla maji stejna znamenka, proto se jedna o elipticky paraboloid.");
end if;
elif typKvadriky = "Stredova regularni" then
if podtypKvadriky = "Elipticky typ" then
text:=cat(text, "Vlastni cisla maji stejna znamenka, proto se jedna o kvadriku eliptickeho typu.");
else
text:=cat(text, "Vlastni cisla maji ruzna znamenka, proto se jedna o kvadriku hyperbolickeho typu.");
end if;
elif typKvadriky = "Stredova singularni" then
if nazevKvadriky = "bod (imaginarni kuzelova plocha)" then
text:=cat(text, "Vlastni cisla maji stejna znamenka, proto se jedna o bod, cili imaginarni kuzelovou plochu.");
else
text:=cat(text, "Vlastni cisla maji ruzna znamenka, proto se jedna o kuzelovou plochu.");
end if;
end if;
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("reseniCharRce")), reseniCharRceMML)));
end if;
if krok = 5 then
text:="Nyni najdeme hlavni smery kvadriky. Tyto smery jsou urceny vlastnimi vektory, ktere jsou prirazene vlastnim cislum (", getReference("reseniCharRce"),"). Prvnimu vlastnimu cislu odpovida soustava (", setReference("vlastniVektorySoustava1"),"), jejiz resenim je ";
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vlastniVektorySoustava1")), vlastniVektorySoustavaMML(lambda1))));
if nops(dosazenoVlastniVektor1) = 3 and type(op(1,dosazenoVlastniVektor1), list) = true then
# resenim je prostor
text:=cat(text, "prostor vektoru. Z teto roviny vybereme, dosazenim za parametry, 3 vlastni vektory - (", setReference("u1"),"), (", setReference("u2"),") a (", setReference("u3"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u1")), uMML(u1, 1))));
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u2")), uMML(u2, 2))));
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u3")), uMML(u3, 3))));
elif nops(dosazenoVlastniVektor1) = 2 and type(op(1,dosazenoVlastniVektor1), list) = true then
# resenim je rovina
text:=cat(text, "rovina vektoru. Z teto roviny vybereme, dosazenim za parametry, 2 vlastni vektory - (", setReference("u1"),"), (", setReference("u2"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u1")), uMML(u1, 1))));
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u2")), uMML(u2, 2))));
else
# resenim je primka
text:=cat(text, "vlastni vektor (", setReference("u1"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u1")), uMML(u1, 1))));
end if;
end if;
if krok = 6 then
text:="";
if evalf(lambda1) = evalf(lambda2) and evalf(lambda1) = evalf(lambda3) then
text:=cat(text, "Vsechna tri vlastni cisla jsou stejna, tudiz jim odpovida stejna soustava (", getReference("vlastniVektorySoustava1"),"), ktera ma stejne reseni jako pro prvni vlastni cislo.");
# dalsi krok tedy muzeme preskocit
aktualniKrok:=aktualniKrok+1;
elif evalf(lambda1) = evalf(lambda2) then
text:=cat(text, "Prvni dve vlastni cisla jsou stejna, tudiz jim odpovida stejna soustava (", getReference("vlastniVektorySoustava1"),"), ktera ma stejne reseni jako pro prvni vlastni cislo.");
else
text:="Druhemu vlastnimu cislu odpovida soustava (", setReference("vlastniVektorySoustava2"),"), jejiz resenim je ";
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vlastniVektorySoustava2")), vlastniVektorySoustavaMML(lambda2))));
if nops(dosazenoVlastniVektor2) = 2 and type(op(1,dosazenoVlastniVektor2), list) = true then
# resenim je rovina
text:=cat(text, "rovina vektoru. Z teto roviny vybereme, dosazenim za parametry, 2 vlastni vektory - (", setReference("u2"),"), (", setReference("u3"),")");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u2")), uMML(u2, 2))));
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u3")), uMML(u3, 3))));
if evalf(lambda2) = 0 then text:=cat(text, ", ktere urcuji asymptoticky smer kvadriky"); end if;
text:=cat(text, ".");
else
# resenim je primka
text:=cat(text, "vlastni vektor (", setReference("u2"),")");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u2")), uMML(u2, 2))));
if evalf(lambda2) = 0 then text:=cat(text, ", ktery urcuje asymptoticky smer kvadriky"); end if;
text:=cat(text, ".");
end if;
end if;
end if;
if krok = 7 then
text:="";
if evalf(lambda1) = evalf(lambda3) then
text:=cat(text, "Prvni a treti vlastni cislo je stejne. Temto dvema cislum tudiz odpovida stejna soustava (", getReference("vlastniVektorySoustava1"),"), ktera ma stejne reseni jako pro prvni vlastni cislo.");
elif evalf(lambda2) = evalf(lambda3) then
text:=cat(text, "Druhe a treti vlastni cislo je stejne. Temto dvema cislum tudiz odpovida stejna soustava (", getReference("vlastniVektorySoustava2"),"), ktera ma stejne reseni jako pro druhe vlastni cislo.");
else
text:="Tretimu vlastnimu cislu odpovida soustava (", setReference("vlastniVektorySoustava3"),"), jejiz resenim je vlastni vektor (", setReference("u3"),")";
if evalf(lambda3) = 0 then text:=cat(text, ", ktery urcuje asymptoticky smer kvadriky"); end if;
text:=cat(text, ".");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vlastniVektorySoustava3")), vlastniVektorySoustavaMML(lambda3))), radekMML(cat(cislovaniMML(getReference("u3")), uMML(u3, 3))));
end if;
end if;
if krok = 8 then
if typKvadriky = "Nestredova regularni" or typKvadriky = "Nestredova singularni" then
if typKvadriky = "Nestredova regularni" then
text:=cat("Nestredovou regularni kvadriku lze prevest vhodnou volbou kartezske soustavy na kanonicky tvar (", setReference("neupravenyKanonickyTvar"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("neupravenyKanonickyTvar")), nestredovaNeupravenyKanonickyTvar1MML)));
text:=cat(text, " Pro kanonickou rovnici kvadriky budeme take potrebovat normovany vektor smeru, ktery je urceny vektorem (", getReference("u3"),"). Takovy vektor ma souradnice (", setReference("e3"),"). Dale vypocitame G podle (", setReference("G"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("e3")), e3MML)), radekMML(cat(cislovaniMML(getReference("G")), GMML)));
else
if evalf(lambda2) = 0 then
text:=cat("Vypocitame normovany vektor smeru, ktery je urceny vektorem (", getReference("u2"),") a normovany vektor smeru, urceny vektorem (", getReference("u3"),"). Takoveto vektory maji souradnice (", setReference("e2"),") a (", setReference("e3"),"). Dale vypocitame F podle (", setReference("F"),") a G podle (", setReference("G"),"). ");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("e2")), e2MML)), radekMML(cat(cislovaniMML(getReference("e3")), e3MML)), radekMML(cat(cislovaniMML(getReference("F")), FMML)), radekMML(cat(cislovaniMML(getReference("G")), GMML)));
if evalf(F) = 0 and evalf(G) = 0 then
text:=cat(text, "Cisla F a G jsou nulove, kvadrika tedy nema zadny stred. Takovouto nestredovou singularni kvadriku, pro jejiz vlastni cisla plati (", setReference("lambdaPodminky"),"), lze prevest vhodnou volbou kartezske soustavy na kanonicky tvar (", setReference("neupravenyKanonickyTvar"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("neupravenyKanonickyTvar")), nestredovaNeupravenyKanonickyTvar3MML)));
else
text:=cat(text, "Jedno z cisel F a G neni nulove, stredem kvadriky je tedy neprazdna mnozina (rovina). Takovouto nestredovou singularni kvadriku, pro jejiz vlastni cisla plati (", setReference("lambdaPodminky"),"), lze prevest vhodnou volbou kartezske soustavy na kanonicky tvar (", setReference("neupravenyKanonickyTvar"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("lambdaPodminky")), lambdaPodminkyMML("≠", "=", "="))));
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("neupravenyKanonickyTvar")), nestredovaNeupravenyKanonickyTvar4MML)));
end if;
else
text:=cat("Nestredovou singularni kvadriku, pro jejiz vlastni cisla plati (", setReference("lambdaPodminky"),"), lze prevest vhodnou volbou kartezske soustavy na kanonicky tvar (", setReference("neupravenyKanonickyTvar"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("lambdaPodminky")), lambdaPodminkyMML("≠", "≠", "="))));
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("neupravenyKanonickyTvar")), nestredovaNeupravenyKanonickyTvar2MML)));
text:=cat(text, " Pro kanonickou rovnici kvadriky budeme take potrebovat hodnotu cisla N. Pro vypocteni teto hodnoty potrebujeme urcit mnozinu stredu kvadriky. Vyresime tedy soustavu rovnic (", setReference("stredSoustava"), ") pro urceni stredu kvadriky, vychazi nam (", setReference("stredSoustavaVysledek"), "), coz je parametricka rovnice ");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("stredSoustava")), stredSoustavaMML)));
if (nops(bodyOsy) > 0) then
text:=cat(text, "primky");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("stredSoustavaVysledek")), osaStreduKvadrikyMML)));
end if;
if (nops(bodyRoviny) > 0) then
text:=cat(text, "roviny");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("stredSoustavaVysledek")), rovinaStreduKvadrikyMML)));
end if;
text:=cat(text, ". Hodnotu N vypocitame dosazenim libovolneho bodu M z mnoziny stredu (", getReference("stredSoustavaVysledek"), ") do rovnice kvadriky. Zvolime bod M napr. jako (", setReference("bodM"), ") a vypocitame hodnotu N (", setReference("N"), ").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("bodM")), bodMMML)), radekMML(cat(cislovaniMML(getReference("N")), NMML)));
end if;
end if;
end if;
if typKvadriky = "Stredova regularni" or typKvadriky = "Stredova singularni" then
text:="Kazdou stredovou kvadriku lze prevest vhodnou volbou kartezske soustavy na kanonicky tvar (", setReference("neupravenyKanonickyTvar"),"). ";
if typKvadriky = "Stredova regularni" then
text:=cat(text, "Vypocitame hodnotu (", setReference("deltaA44"),") a do rovnice (", getReference("neupravenyKanonickyTvar"),") dosadime konkretni hodnoty a dostaneme rovnici (", setReference("dosazenyNeupravenyKanonickyTvar"),").");
else
text:=cat(text, "Clen (", setReference("deltaA44"),") se v rovnici (", getReference("neupravenyKanonickyTvar"),") neprojevi, protoze je roven nule. Do rovnice (", getReference("neupravenyKanonickyTvar"),") dosadime konkretni hodnoty a dostaneme rovnici (", setReference("dosazenyNeupravenyKanonickyTvar"),").");
end if;
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("neupravenyKanonickyTvar")), stredovaNeupravenyKanonickyTvarMML)), radekMML(cat(cislovaniMML(getReference("deltaA44")), deltaA44MML)), radekMML(cat(cislovaniMML(getReference("dosazenyNeupravenyKanonickyTvar")), neupravenyKanonickyTvarDosazenoMML)));
end if;
end if;
if krok = 9 then
if typKvadriky = "Nestredova regularni" or typKvadriky = "Nestredova singularni" then
text:="Do rovnice (", getReference("neupravenyKanonickyTvar"),") dosadime konkretni hodnoty a dostaneme kanonicky tvar (", setReference("dosazenyNeupravenyKanonickyTvar"),") rovnice kvadriky.";
text:=cat(text, " Tento kanonicky tvar muzeme jeste upravit na tvar (", setReference("upravenyKanonickyTvar"),"), kde plati (", setReference("delkyPoloos"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("dosazenyNeupravenyKanonickyTvar")), neupravenyKanonickyTvarDosazenoMML)), radekMML(cat(cislovaniMML(getReference("upravenyKanonickyTvar")), kanonickaRceMML)), radekMML(cat(cislovaniMML(getReference("delkyPoloos")), delkyPoloosMML)));
if nazevKvadriky = "rotacni paraboloid" then
text:=cat(text, " Jelikoz rovina z=k, kde plati (", setReference("rezRovK"),"), protina kvadriku v kruznici, rikame kvadrice o rovnici (", getReference("upravenyKanonickyTvar"),") rotacni paraboloid.");
if signum(rhs(kanonickaRce)/z) = -1 then
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovK2MML(0,"<"))));
else
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovK2MML(0,">"))));
end if;
else
text:=cat(text, " Kvadrice o rovnici (", getReference("upravenyKanonickyTvar"),") rikame ", nazevKvadriky,".");
end if;
end if;
if typKvadriky = "Stredova regularni" or typKvadriky = "Stredova singularni" then
text:="";
rovnice:="dosazenyNeupravenyKanonickyTvar";
if puvodniNeupravenaKanonickaRce = -neupravenaKanonickaRce then
text:=cat(text, "Rovnici (", getReference("dosazenyNeupravenyKanonickyTvar"),") vynasobime cislem -1 a dostaneme (", setReference("-dosazenyNeupravenyKanonickyTvar"),"). ");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("-dosazenyNeupravenyKanonickyTvar")), minusNeupravenyKanonickyTvarDosazenoMML)));
rovnice:="-dosazenyNeupravenyKanonickyTvar";
end if;
if evalf(rhs(neupravenaKanonickaRce)) > 0 then
text:=cat(text, "Cislo (", getReference("deltaA44"),") je v rovnici (", getReference(rovnice),") zaporne. Po vydeleni rovnice (", getReference(rovnice),") cislem minus (", getReference("deltaA44"),") dostaneme kvadriku, jejiz kanonicky tvar je (", setReference("kanonickaRce"),"), pricemz plati (", setReference("delkyPoloos"),").");
elif evalf(rhs(neupravenaKanonickaRce)) < 0 then
text:=cat(text, "Cislo (", getReference("deltaA44"),") je v rovnici (", getReference(rovnice),") kladne. Po vydeleni rovnice (", getReference(rovnice),") cislem (", getReference("deltaA44"),") dostaneme kvadriku, jejiz kanonicky tvar je (", setReference("kanonickaRce"),"), pricemz plati (", setReference("delkyPoloos"),").");
else
text:=cat(text, "Rovnici (", getReference(rovnice),") muzeme jeste upravit. Tim dostaneme konecny tvar kanonicke rovnice (", setReference("kanonickaRce"),"), pricemz plati (", setReference("delkyPoloos"),").");
end if;
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("kanonickaRce")), kanonickaRceMML)), radekMML(cat(cislovaniMML(getReference("delkyPoloos")), delkyPoloosMML)));
if nazevKvadriky = "zplostely rotacni elipsoid" then
text:=cat(text, " Jelikoz jsou delky dvou poloos stejne a treti poloosa je nejkratsi, rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky,".");
elif nazevKvadriky = "vejcity rotacni elipsoid" then
text:=cat(text, " Jelikoz jsou delky dvou poloos stejne a treti poloosa je nejdelsi, rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky,".");
elif nazevKvadriky = "kulova plocha" then
text:=cat(text, " Jelikoz jsou delky vsech tri poloos stejne, rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky,".");
elif (substring(nazevKvadriky, 1..3) = "rov" or substring(nazevKvadriky, 1..3) = "rot") and (nazevKvadriky <> "rotacni kuzelova plocha") then
if signum(lambda1) = -1 then
rezRov1:="y=0, popr. z=0";
rezRov2:=cat("x=k, kde plati (", setReference("rezRovK"),"),");
elif signum(lambda2) = -1 then
rezRov1:="x=0, popr. z=0";
rezRov2:=cat("y=k, kde plati (", setReference("rezRovK"),"),");
else
rezRov1:="x=0, popr. y=0";
rezRov2:=cat("z=k, kde plati (", setReference("rezRovK"),"),");
end if;
if (substring(nazevKvadriky, 1..3) = "rov" and substring(nazevKvadriky, 18) = "j") or (substring(nazevKvadriky, 1..3) = "rot" and substring(nazevKvadriky, 9) = "j") then
# jednodilny hyperboloid
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovKvRMML)));
else
# dvojdilny hyperboloid
if signum(lambda1) = -1 then
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovKMML(a))));
elif signum(lambda2) = -1 then
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovKMML(b))));
else
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovKMML(c))));
end if;
end if;
if substring(nazevKvadriky, 1..3) = "rot" then
text:=cat(text, " Jelikoz rovina ", rezRov2," protina kvadriku v kruznici, rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky, ".");
else
text:=cat(text, " Jelikoz jsou delky vsech tri poloos stejne (rovina ", rezRov1," protina kvadriku v rovnoose hyperbole a rovina ", rezRov2," protina kvadriku v kruznici), rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky, ".");
end if;
elif nazevKvadriky = "rotacni kuzelova plocha" then
text:=cat(text, " Jelikoz rovina z=k, kde plati (", setReference("rezRovK"),") protina kvadriku v kruznici, rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky,".");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovKMML(0))));
else
text:=cat(text, " Kvadrice o rovnici (", getReference("kanonickaRce"),") rikame ", nazevKvadriky,".");
end if;
end if;
end if;
if krok = 10 then
text:="Kanonickou rovnici kvadriky si nyni zobrazime.";
Maplets:-Tools:-Set('ChB1'('value') = 'true');
prekresli();
end if;
if krok = 11 then
text:="Pro prehlednost transformovanou kvadriku zase skryjeme a budeme vysetrovat puvodni polohu kvadriky. ";
if typKvadriky = "Stredova regularni" or typKvadriky = "Stredova singularni" then
text:=cat(text, "Jelikoz jde o stredovou kvadriku, zajimaji nas souradnice stredu S. Stred vypocitame vyresenim soustavy (", setReference("stredSoustava"),") pro urceni stredu kvadriky. Vychazi nam stred (", setReference("S"),"), ktery si zobrazime.");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("stredSoustava")), stredSoustavaMML)), radekMML(cat(cislovaniMML(getReference("S")), SMML)));
Maplets:-Tools:-Set('ChB5'('value') = 'true');
prekresli();
end if;
text:=cat(text, "Urcime hlavni roviny. Hlavni rovina je prumerova rovina, ktera je kolma k hlavnimu smeru kvadriky. Rovnici hlavni roviny lze ziskat pomoci vztahu (", setReference("vztahProZiskaniHlavnichRovin"),") (kde K je matice koeficientu kvadriky) dosazenim vlastniho vektoru, ktery nenalezi asymptotickemu smeru kvadriky.");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vztahProZiskaniHlavnichRovin")), vztahProZiskaniHlavnichRovinMML)));
Maplets:-Tools:-Set('ChB1'('value') = 'false');
prekresli();
end if;
if krok = 12 then
text:="Prvni vlastni cislo ";
if evalf(lambda1) <> 0 then
text:=cat(text, "je ruzne od nuly, tzn., ze nenalezi asymptotickemu smeru. Dosazenim prvniho vlastniho vektoru do (", getReference("vztahProZiskaniHlavnichRovin"),") ziskame (", setReference("vztahProZiskaniHlavnichRovinDosazeno1"),"). Vynasobenim dostavame rovnici hlavni roviny (", setReference("hlavniRovina1"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vztahProZiskaniHlavnichRovinDosazeno1")), vztahProZiskaniHlavnichRovinDosazenoMML(u1))), radekMML(cat(cislovaniMML(getReference("hlavniRovina1")), hlavniRovina1MML)));
else
text:=cat(text, "je rovno nule, tzn., ze nalezi asymptotickemu smeru.");
end if;
end if;
if krok = 13 then
text:="Druhe vlastni cislo ";
if evalf(lambda2) <> 0 then
text:=cat(text, "je ruzne od nuly, tzn., ze nenalezi asymptotickemu smeru. Dosazenim druheho vlastniho vektoru do (", getReference("vztahProZiskaniHlavnichRovin"),") ziskame (", setReference("vztahProZiskaniHlavnichRovinDosazeno2"),"). Vynasobenim dostavame rovnici hlavni roviny (", setReference("hlavniRovina2"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vztahProZiskaniHlavnichRovinDosazeno2")), vztahProZiskaniHlavnichRovinDosazenoMML(u2))), radekMML(cat(cislovaniMML(getReference("hlavniRovina2")), hlavniRovina2MML)));
else
text:=cat(text, "je rovno nule, tzn., ze nalezi asymptotickemu smeru.");
end if;
end if;
if krok = 14 then
text:="Treti vlastni cislo ";
if evalf(lambda3) <> 0 then
text:=cat(text, "je ruzne od nuly, tzn., ze nenalezi asymptotickemu smeru. Dosazenim tretiho vlastniho vektoru do (", getReference("vztahProZiskaniHlavnichRovin"),") ziskame (", setReference("vztahProZiskaniHlavnichRovinDosazeno3"),"). Vynasobenim dostavame rovnici hlavni roviny (", setReference("hlavniRovina3"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vztahProZiskaniHlavnichRovinDosazeno3")), vztahProZiskaniHlavnichRovinDosazenoMML(u3))), radekMML(cat(cislovaniMML(getReference("hlavniRovina3")), hlavniRovina3MML)));
else
text:=cat(text, "je rovno nule, tzn., ze nalezi asymptotickemu smeru.");
end if;
end if;
if krok = 15 then
if evalf(lambda2) = 0 and evalf(lambda3) = 0 then
text:="Hlavni rovinu si nyni zobrazime.";
else
text:="Hlavni roviny si nyni zobrazime.";
end if;
Maplets:-Tools:-Set('ChB3'('value') = 'true');
prekresli();
end if;
if krok = 16 then
text:="Dale vyresime osy kvadriky. Osa kvadriky je prusecnice dvou hlavnich rovin. ";
if evalf(lambda2) = 0 then
text:=cat(text, "V nasem pripade ale existuje pouze jedna hlavni rovina, proto nema kvadrika zadne osy.");
end if;
if evalf(lambda2) <> 0 and evalf(lambda3) = 0 then
text:=cat(text, "V nasem pripade existuji dve hlavni roviny, proto ma kvadrika jednu osu.");
elif evalf(lambda2) <> 0 and evalf(lambda3) <> 0 then
text:=cat(text, "V nasem pripade existuji vsechny tri hlavni roviny, proto ma kvadrika tri osy.");
end if;
if evalf(lambda2) <> 0 then
text:=cat(text, " Prusecik prvni (", getReference("hlavniRovina1"),") a druhe (", getReference("hlavniRovina2"),") hlavni roviny nam dava osu (", setReference("osa1"),").");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("osa1")), osaMML(1,2))));
end if;
if evalf(lambda2) <> 0 and evalf(lambda3) = 0 then
text:=cat(text, " Osu si nyni zobrazime.");
end if;
if evalf(lambda3) <> 0 then
text:=cat(text, " Prusecik prvni (", getReference("hlavniRovina1"),") a treti (", getReference("hlavniRovina3"),") hlavni roviny nam dava osu (", setReference("osa2"),").");
text:=cat(text, " Prusecik druhe (", getReference("hlavniRovina2"),") a treti (", getReference("hlavniRovina3"),") hlavni roviny nam dava osu (", setReference("osa3"),").");
text:=cat(text," Osy si nyni zobrazime.");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("osa2")), osaMML(1,3))), radekMML(cat(cislovaniMML(getReference("osa3")), osaMML(2,3))));
end if;
Maplets:-Tools:-Set('ChB4'('value') = 'true');
prekresli();
end if;
if krok = 17 then
text:="";
if typKvadriky = "Nestredova regularni" then
text:=cat(text, "Jelikoz se jedna o ", nazevKvadriky, ", zajima nas jeste vrchol kvadriky, coz je prusecik kvadriky s jeji osou. Vychazi nam vrchol (", setReference("V"),"). Vrchol i puvodni kvadriku nakonec zobrazime.");
MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("V")), VMML)));
Maplets:-Tools:-Set('ChB5'('value') = 'true');
else
text:=cat(text, "Nakonec puvodni kvadriku zobrazime.");
end if;
Maplets:-Tools:-Set('ChB2'('value') = 'true');
prekresli();
end if;
celyMMLtext:=cat(celyMMLtext, MMLtext);
# MMLtext:=cat(MMLtext, paticka);
Maplets:-Tools:-Set('doprovodnyText' ('appendline') = cat("- ", text));
Maplets:-Tools:-Set('doprovodnyText' ('appendline') = "");
return cat(hlavicka, celyMMLtext, paticka);
end proc:
kresli:=proc(size)
local xd,xh,yd,yh,zd,zh;
global hlavniRovinap, osaKvadriky1p, osaKvadriky2p, osaKvadriky3p, Vp, Vt, V, transformovanaKvadrikap, puvodniKvadrikap, Sp, St,
hlavniRovina1, hlavniRovina2, hlavniRovina3, bodyOsyKvadriky, kanonickaRce, prazdnop;
xd:=-size:xh:=size:yd:=-size:yh:=size:zd:=-size:zh:=size:
if evalf(lambda1) <> 'lambda1' then
hlavniRovinap:=implicitplot3d({hlavniRovina1,hlavniRovina2,hlavniRovina3},x=xd..xh,y=yd..yh,z=zd..zh,grid=[kvalita1,kvalita1,kvalita1],style=LINE,scaling=constrained,shading=XYZ,gridstyle=rectangular);
bodyOsyKvadriky:=proc(hlRovina1,hlRovina2)
local bodyOsy,tmp,B1,B2,a;
bodyOsy:=eval([x,y,z],solve({hlRovina1,hlRovina2},{x,y,z}));
tmp:=solve({bodyOsy[1]>=xd,bodyOsy[2]>=yd,bodyOsy[3]>=zd,bodyOsy[1]<=xh,bodyOsy[2]<=yh,bodyOsy[3]<=zh});
if tmp = NULL or nops(tmp) = 1 then
return NULL;
end if;
B1:=[]:B2:=[]:
for a from 1 to nops(tmp) do
# if type(tmp[a],`<=`) then
if type(evalf(lhs(tmp[a])),numeric) then
B1:=[op(B1),isolate(convert(tmp[a],equality),rhs(tmp[a]))];
else
B2:=[op(B2),convert(tmp[a],equality)];
end if;
# end if;
end do;
return [subs(op(B1),bodyOsy),subs(op(B2),bodyOsy)];
end proc:
osaKvadriky1p:=NULL:osaKvadriky2p:=NULL:osaKvadriky3p:=NULL:
if hlavniRovina3 = NULL then
if hlavniRovina2 <> NULL then
if bodyOsyKvadriky(hlavniRovina1,hlavniRovina2) <> NULL then
osaKvadriky1p:=polygonplot3d(bodyOsyKvadriky(hlavniRovina1,hlavniRovina2),scaling=constrained,view=[xd..xh,yd..yh,zd..zh]);
end if;
end if;
else
if bodyOsyKvadriky(hlavniRovina1,hlavniRovina2) <> NULL then
osaKvadriky1p:=polygonplot3d(bodyOsyKvadriky(hlavniRovina1,hlavniRovina2),scaling=constrained,view=[xd..xh,yd..yh,zd..zh]);
end if;
if bodyOsyKvadriky(hlavniRovina2,hlavniRovina3) <> NULL then
osaKvadriky2p:=polygonplot3d(bodyOsyKvadriky(hlavniRovina2,hlavniRovina3),scaling=constrained,view=[xd..xh,yd..yh,zd..zh]);
end if;
if bodyOsyKvadriky(hlavniRovina1,hlavniRovina3) <> NULL then
osaKvadriky3p:=polygonplot3d(bodyOsyKvadriky(hlavniRovina1,hlavniRovina3),scaling=constrained,view=[xd..xh,yd..yh,zd..zh]);
end if;
end if;
Vp:=NULL:Vt:=NULL:
if delta <> 0 and A44 = 0 then
# if evalf(lambda1) <> evalf(lambda2) then
V:=eval([x,y,z],solve({hlavniRovina1,hlavniRovina2,kvadrika},{x,y,z}));
if zapnoutNumerickeVypocty = 1 then
V:=evalf(V);
end if;
Vp:=pointplot3d(V,color=black,symbol=CROSS,symbolsize=15,view=[xd..xh,yd..yh,zd..zh]);
Vt:=textplot3d([V[1],V[2],V[3],'V'],color=black,align=LEFT,font=[HELVETICA,ROMAN,13],view=[xd..xh,yd..yh,zd..zh]);
# end if;
end if;
transformovanaKvadrikap:=NULL:
if nazevKvadriky = "primka (imaginarni ruznobezne roviny)" then
# implicitplot3d nezobrazi primku
transformovanaKvadrikap:=polygonplot3d([[0,0,zd],[0,0,zh]],scaling=constrained,view=[xd..xh,yd..yh,zd..zh]);
elif nazevKvadriky = "bod (imaginarni kuzelova plocha)" then
transformovanaKvadrikap:=pointplot3d([0,0,0], color=black, symbol=CROSS, symbolsize=15, view=[xd..xh,yd..yh,zd..zh]):
elif nazevKvadriky = "dvojnasobna rovina" then
# implicitplot3d nechce zobrazit x^2, ale odmocninu zobrazi
transformovanaKvadrikap:=implicitplot3d(sqrt(lhs(factor(kanonickaRce)),symbolic),x=xd..xh,y=yd..yh,z=zd..zh,grid=[kvalita2,kvalita2,kvalita2],style=PATCHNOGRID,scaling=constrained,shading=XY);
else
transformovanaKvadrikap:=implicitplot3d(kanonickaRce,x=xd..xh,y=yd..yh,z=zd..zh,grid=[kvalita2,kvalita2,kvalita2],style=PATCHNOGRID,scaling=constrained,shading=XY);
end if;
puvodniKvadrikap:=NULL:
if nazevKvadriky = "primka (imaginarni ruznobezne roviny)" then
# implicitplot3d nezobrazi primku
puvodniKvadrikap:=polygonplot3d(bodyOsyKvadriky(hlavniRovina1,hlavniRovina2),scaling=constrained,view=[xd..xh,yd..yh,zd..zh]);
elif nazevKvadriky = "bod (imaginarni kuzelova plocha)" then
puvodniKvadrikap:=pointplot3d(S, color=black, symbol=CROSS, symbolsize=15, view=[xd..xh,yd..yh,zd..zh]):
elif nazevKvadriky = "dvojnasobna rovina" then
# implicitplot3d nechce zobrazit (ax+by+cz+d)^2 - v tomto pripade puvodni kvadrice odpovida hlavni rovina, takze muzeme zobrazit ji
puvodniKvadrikap:=implicitplot3d(hlavniRovina1,x=xd..xh,y=yd..yh,z=zd..zh,grid=[kvalita2,kvalita2,kvalita2],style=PATCHNOGRID,scaling=constrained,shading=ZGRAYSCALE);
else
puvodniKvadrikap:=implicitplot3d(kvadrika,x=xd..xh,y=yd..yh,z=zd..zh,grid=[kvalita2,kvalita2,kvalita2],style=PATCHNOGRID,scaling=constrained,shading=ZGRAYSCALE);
end if;
Sp:=NULL:St:=NULL:
if (delta <> 0 and A44 <> 0) or (delta = 0 and A44 <> 0) then
Sp:=pointplot3d(S,color=black,symbol=CROSS,symbolsize=15,view=[xd..xh,yd..yh,zd..zh]);
St:=textplot3d([S[1],S[2],S[3],'S'],color=black,align=LEFT,font=[HELVETICA,ROMAN,13],view=[xd..xh,yd..yh,zd..zh]);
end if;
end if;
prazdnop:=pointplot3d([0,0,0], color=white, axes=BOXED, view=[-size..size,-size..size,-size..size]):
end proc:
prekresli:=proc()
local zobrazit, i, j, titulek;
zobrazit:=[];
if Maplets:-Tools:-Get('ChB1') then
zobrazit:=[op(zobrazit), transformovanaKvadrikap];
end if;
if Maplets:-Tools:-Get('ChB2') then
zobrazit:=[op(zobrazit), puvodniKvadrikap];
end if;
if Maplets:-Tools:-Get('ChB3') then
zobrazit:=[op(zobrazit), hlavniRovinap];
end if;
if Maplets:-Tools:-Get('ChB4') then
zobrazit:=[op(zobrazit), osaKvadriky1p, osaKvadriky2p, osaKvadriky3p];
end if;
if Maplets:-Tools:-Get('ChB5') then
zobrazit:=[op(zobrazit), Sp, St, Vp, Vt];
end if;
j:=false;
for i in zobrazit do
if i <> NULL then j:=true; end if;
end do;
if j = false then
zobrazit:=prazdnop;
titulek:="";
else
titulek:=cat(typKvadriky," kvadrika\n",nazevKvadriky);
end if;
Maplets:-Tools:-Set('plotter'('value') = display3d(zobrazit, title=titulek, axes=boxed));
end proc:
# KONEC PROCEDUR PRO DEFINICI MATHML VYPISU
# ZACATEK HLAVNICH VYPOCTU
hlavniVypocty:=proc()
global delta, A44, typKvadriky, lambda1, lambda2, lambda3,
a11, a12, a13, a14, a21, a22, a23, a24, a31, a32, a33, a34, a41, a42, a43, a44,
K, kvadrika, charRce, rozepsanaCharRce, reseniCharRce, r1, r2, r3, u1, u2, u3,
e2, e3, G, F, kanonickaRce, a, b, c, r, nazevKvadriky, neupravenaKanonickaRce, puvodniNeupravenaKanonickaRce, podtypKvadriky,
bodyOsy, bodyRoviny, M, N, neupravenaKanonickaRce2,
S, hr, hlavniRovina1, hlavniRovina2, hlavniRovina3, hlavniRovinap, bodyOsyKvadriky, osaKvadriky1p, osaKvadriky2p, osaKvadriky3p,
Vp, Vt, V, transformovanaKvadrikap, puvodniKvadrikap, Sp, St, prazdnop, defaultSize,
dosazenoVlastniVektor1, dosazenoVlastniVektor2, dosazenoVlastniVektor3;
local xd, xh, yd, yh, zd, zh, tmp, vlastniVektor1, vlastniVektor2, vlastniVektor3, dosazeni, ea, eb, ec, er, l1, l2, l3, mnozinaStredu, i, j, k, komplexniChyba,
rce, l, tmp2;
# ZACATEK VYPOCTU
# Matice K je symetricka
a21:=a12:a31:=a13:a32:=a23:a41:=a14:a42:=a24:a43:=a34:
kvadrika:=a11*x^2+a22*y^2+a33*z^2+2*a12*x*y+2*a13*x*z+2*a23*y*z+2*a14*x+2*a24*y+2*a34*z+a44;
K:=matrix([[a11,a12,a13,a14],[a21,a22,a23,a24],[a31,a32,a33,a34],[a41,a42,a43,a44]]);
delta:=det(K);
A44:=det(submatrix(K,1..3,1..3));
charRce:=det(evalm(submatrix(K,1..3,1..3)-lambda))=0;
rozepsanaCharRce:=lhs(charRce);
reseniCharRce:=[solve(charRce,lambda)];
#
# opraveni chyby, kdy vychazi lambdy jako komplexni cisla
komplexniChyba:=false;
for i from 1 to 3 do
if not type(evalf(reseniCharRce[i]), realcons) then
# cislo vyjadrime v goniometrickem tvaru, kde uz komplexni cisla nebudou
reseniCharRce:=subsop(i=evalc(reseniCharRce[i]), reseniCharRce);
komplexniChyba:=true;
end if;
end do;
lambda1:=reseniCharRce[1]:lambda2:=reseniCharRce[2]:lambda3:=reseniCharRce[3]:
# V pripade, ze je jedno z lambd rovno nule, chceme, aby to bylo lambda3 - chceme, aby nulove lambdy mely vetsi indexy nez nenulove.
if evalf(lambda3) <> 0 then
if evalf(lambda1) = 0 then tmp:=lambda3:lambda3:=lambda1:lambda1:=tmp;
elif evalf(lambda2) = 0 then tmp:=lambda2:lambda2:=lambda3:lambda3:=tmp; end if;
end if:
r1:=lambda->(a11-lambda)*u+a12*v+a13*w=0:
r2:=lambda->a21*u+(a22-lambda)*v+a23*w=0:
r3:=lambda->a31*u+a32*v+(a33-lambda)*w=0:
if komplexniChyba then
rce:=[r1,r2,r3];
l:=[lambda1,lambda2,lambda3];
tmp2:=["","",""];
for i from 1 to 3 do
for j from 1 to 2 do
if op(i,tmp2) <> "" then break; end if;
for k from j+1 to 3 do
tmp:=eval([u,v,w],solve({rce[j](l[i]),rce[k](l[i])},{u,v,w}));
if (tmp[1]=`u` and tmp[2]=`v`) or (tmp[2]=`v` and tmp[3]=`w`) or (tmp[2]=`v` and tmp[3]=`w`) or (tmp[1]=`u` and tmp[2]=`v` and tmp[3]=`w`) then
next;
else
tmp2[i]:=tmp;
break;
end if;
end do;
end do;
end do;
vlastniVektor1:=tmp2[1];
vlastniVektor2:=tmp2[2];
vlastniVektor3:=tmp2[3];
else
vlastniVektor1:=eval([u,v,w],solve({r1(lambda1),r2(lambda1),r3(lambda1)},{u,v,w})):
vlastniVektor2:=eval([u,v,w],solve({r1(lambda2),r2(lambda2),r3(lambda2)},{u,v,w})):
vlastniVektor3:=eval([u,v,w],solve({r1(lambda3),r2(lambda3),r3(lambda3)},{u,v,w})):
end if;
dosazeni:=proc(vektor)
#
local p, i, j, k, l, m, tmp1, tmp2;
p:=[];tmp2:=[];l:=1;
if vektor[1] = `u` then p:=[op(p),`u`]; end if;
if vektor[2] = `v` then p:=[op(p),`v`]; end if;
if vektor[3] = `w` then p:=[op(p),`w`]; end if;
for k in p do
tmp1:=vektor;
m:=0;
for i in p do
m:=m+1;
if m = l then j:=1; else j:=0; end if;
tmp1:=subs(i=j, tmp1);
end do;
l:=l+1;
tmp2:=[op(tmp2),tmp1];
end do;
if vektor[1] <> `u` and vektor[2] <> `v` and vektor[3] <> `w` then
return [vektor];
else
return tmp2;
end;
end proc:
#
dosazenoVlastniVektor1:=dosazeni(vlastniVektor1);
#
dosazenoVlastniVektor2:=dosazeni(vlastniVektor2);
#
dosazenoVlastniVektor3:=dosazeni(vlastniVektor3);
# Každému vlastnímu číslu lambda_i odpovídá vlastní vektor u_i.
if evalf(lambda1) <> evalf(lambda2) and evalf(lambda1) <> evalf(lambda3) and evalf(lambda2) <> evalf(lambda3) then
u1:=op(1,dosazenoVlastniVektor1);
u2:=op(1,dosazenoVlastniVektor2);
u3:=op(1,dosazenoVlastniVektor3);
elif evalf(lambda1) = evalf(lambda2) and evalf(lambda1) <> evalf(lambda3) then
u1:=op(1,dosazenoVlastniVektor1);
u2:=op(2,dosazenoVlastniVektor1);
u3:=op(1,dosazenoVlastniVektor3);
elif evalf(lambda1) = evalf(lambda3) and evalf(lambda1) <> evalf(lambda2) then
u1:=op(1,dosazenoVlastniVektor1);
u2:=op(1,dosazenoVlastniVektor2);
u3:=op(2,dosazenoVlastniVektor1);
elif evalf(lambda2) = evalf(lambda3) and evalf(lambda2) <> evalf(lambda1) then
u1:=op(1,dosazenoVlastniVektor1);
u2:=op(1,dosazenoVlastniVektor2);
u3:=op(2,dosazenoVlastniVektor2);
else
u1:=op(1,dosazenoVlastniVektor1);
u2:=op(2,dosazenoVlastniVektor1);
u3:=op(3,dosazenoVlastniVektor1);
end if;
# Stredova regularni kvadrika
if delta <> 0 and A44 <> 0 then
typKvadriky:="Stredova regularni";
neupravenaKanonickaRce:=lambda1*x^2+lambda2*y^2+lambda3*z^2=-delta/A44:
puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce;
a:=rhs(neupravenaKanonickaRce)/lambda1:a:=sqrt(a*signum(a)):
b:=rhs(neupravenaKanonickaRce)/lambda2:b:=sqrt(b*signum(b)):
c:=rhs(neupravenaKanonickaRce)/lambda3:c:=sqrt(c*signum(c)):
r:=1:
ea:=evalf(a):eb:=evalf(b):ec:=evalf(c):er:=evalf(r):
if (signum(lambda1) = signum(lambda2)) and (signum(lambda2) = signum(lambda3)) then
# vlastni cisla maji stejna znamenka - Eliptickeho typu
podtypKvadriky:="Elipticky typ";
if (evalf(lambda1) < 0) then
# na leve strane rovnice chceme jen kladne koeficienty
neupravenaKanonickaRce:=-neupravenaKanonickaRce:
end if;
if evalf(rhs(neupravenaKanonickaRce)) > 0 then
# v pripade, ze je prava strana rovnice kladna, ma rovnice realne reseni - Trojosy elipsoid
kanonickaRce:=neupravenaKanonickaRce/rhs(neupravenaKanonickaRce);
if (ea = eb and eb > ec) or (ea = ec and ec > eb) or (eb = ec and ec > ea) then
nazevKvadriky:="zplostely rotacni elipsoid":
elif (ea = eb and eb < ec) or (ea = ec and ec < eb) or (eb = ec and ec < ea) then
nazevKvadriky:="vejcity rotacni elipsoid":
elif ea = eb and eb = ec then
nazevKvadriky:="kulova plocha":
else
nazevKvadriky:="trojosy elipsoid":
end if;
elif evalf(rhs(neupravenaKanonickaRce)) < 0 then
# v pripade, ze je prava strana rovnice zaporna, kvadrika neobsahuje zadny realny bod - Imaginarni elipsoid
nazevKvadriky:="imaginarni elipsoid";
kanonickaRce:=neupravenaKanonickaRce/(-rhs(neupravenaKanonickaRce));
end if;
else
# vlastni cisla maji ruzna znamenka - Hyperbolickeho typu
l1:=lambda1:l2:=lambda2:l3:=lambda3:
# chceme, aby byl pouze jeden koeficient z leve strany rovnice zaporny
podtypKvadriky:="Hyperbolicky typ";
if signum(lambda1*lambda2*lambda3) = 1 then
neupravenaKanonickaRce:=-neupravenaKanonickaRce:
l1:=-l1:l2:=-l2:l3:=-l3:
end if;
if evalf(rhs(neupravenaKanonickaRce)) < 0 then
# v pripade, ze je prava strana rovnice zaporna - Dvojdilny hyperboloid
nazevKvadriky:="dvojdilny hyperboloid";
kanonickaRce:=neupravenaKanonickaRce/(-rhs(neupravenaKanonickaRce));
elif evalf(rhs(neupravenaKanonickaRce)) > 0 then
# v pripade, ze je prava strana rovnice kladna - Jednodilny hyperboloid
nazevKvadriky:="jednodilny hyperboloid";
kanonickaRce:=neupravenaKanonickaRce/rhs(neupravenaKanonickaRce);
end if;
if ea = eb and eb = ec then
nazevKvadriky:=cat("rovnoosy rotacni ", nazevKvadriky);
elif (ea = eb and signum(l3)=-1) or (ea = ec and signum(l2)=-1) or (eb = ec and signum(l1)=-1) then
nazevKvadriky:=cat("rotacni ", nazevKvadriky);
end if;
end if;
end if;
# Stredova singularni
if delta = 0 and A44 <> 0 then
typKvadriky:="Stredova singularni":
neupravenaKanonickaRce:=lambda1*x^2+lambda2*y^2+lambda3*z^2=0:
puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce;
a:=1/lambda1:a:=sqrt(a*signum(a)):
b:=1/lambda2:b:=sqrt(b*signum(b)):
c:=1/lambda3:c:=sqrt(c*signum(c)):
ea:=evalf(a):eb:=evalf(b):ec:=evalf(c):
if (signum(lambda1) = signum(lambda2)) and (signum(lambda2) = signum(lambda3)) then
# Imaginarni kuzelova plocha
nazevKvadriky:="bod (imaginarni kuzelova plocha)";
# chceme, aby koeficienty u prave strany rovnice byly kladne
if evalf(lambda1) < 0 then
neupravenaKanonickaRce:=-neupravenaKanonickaRce;
end if;
else
# Kuzelova plocha
l1:=lambda1:l2:=lambda2:l3:=lambda3:
# chceme, aby byl pouze jeden koeficient z leve strany rovnice zaporny
if signum(lambda1*lambda2*lambda3) = 1 then
neupravenaKanonickaRce:=-neupravenaKanonickaRce:
l1:=-l1:l2:=-l2:l3:=-l3:
end if;
if (ea = eb and signum(l3)=-1) or (ea = ec and signum(l2)=-1) or (eb = ec and signum(l1)=-1) then
nazevKvadriky:="rotacni kuzelova plocha";
else
nazevKvadriky:="kuzelova plocha";
end if;
end if;
kanonickaRce:=neupravenaKanonickaRce;
end if;
# Nestredova regularni
if delta <> 0 and A44 = 0 then
typKvadriky:="Nestredova regularni":
e3:=evalm(u3/norm(u3,2));
G:=a14*e3[1]+a24*e3[2]+a34*e3[3];
neupravenaKanonickaRce:=lambda1*x^2+lambda2*y^2=-2*G*z:
puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce;
a:=G/lambda1:a:=sqrt(a*signum(a)):
b:=G/lambda2:b:=sqrt(b*signum(b)):
ea:=evalf(a):eb:=evalf(b):
if signum(lambda1) = signum(lambda2) then
# Elipticky paraboloid
# chceme, aby koeficienty u prave strany rovnice byly kladne
if evalf(lambda1) < 0 then
neupravenaKanonickaRce:=-neupravenaKanonickaRce;
end if;
kanonickaRce:=neupravenaKanonickaRce/(G*signum(G));
if ea = eb then
nazevKvadriky:="rotacni paraboloid";
else
nazevKvadriky:="elipticky paraboloid";
end if;
else
# Hyperbolicky paraboloid
nazevKvadriky:="hyperbolicky paraboloid";
kanonickaRce:=neupravenaKanonickaRce/(G*signum(G));
end if;
end if;
# Nestredova singularni
if delta = 0 and A44 = 0 then
typKvadriky:="Nestredova singularni":
e3:=evalm(u3/norm(u3,2));
G:=a14*e3[1]+a24*e3[2]+a34*e3[3];
e2:=evalm(u2/norm(u2,2));
F:=a14*e2[1]+a24*e2[2]+a34*e2[3];
bodyOsy:=[];bodyRoviny:=[];
if evalf(lambda2) <> 0 or (evalf(lambda2) = 0 and evalf(F) = 0 and evalf(G) = 0) then
mnozinaStredu:=eval([m,n,p],solve(geneqns(submatrix(K,1..3,1..3),[m,n,p],evalm(-1*subvector(K,1..3,4))),{m,n,p}));
# za parametr dosadime hodnotu 0
M:=mnozinaStredu;
if M[1] = `m` then M:=subs(m=0, M); end if;
if M[2] = `n` then M:=subs(n=0, M); end if;
if M[3] = `p` then M:=subs(p=0, M); end if;
if evalf(lambda1) <> 0 and evalf(lambda2) <> 0 and evalf(lambda3) = 0 then
# primka stredu
bodyOsy:=mnozinaStredu;
elif evalf(lambda1) <> 0 and evalf(lambda2) = 0 and evalf(lambda3) = 0 then
# rovina stredu
bodyRoviny:=mnozinaStredu;
end if;
# hodnotu N urcime dosazenim libovolneho bodu M osy nebo roviny do rovnice kvadriky
N:=subs(x=M[1], y=M[2], z=M[3], kvadrika);
end if;
if evalf(lambda1) <> 0 and evalf(lambda2) <> 0 and evalf(lambda3) = 0 then
neupravenaKanonickaRce:=lambda1*x^2+lambda2*y^2=-N;
puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce;
# G = 0, F = 0, E = 0, H = N
if evalf(N) <> 0 then
# Valcova plocha
a:=N/lambda1:a:=sqrt(a*signum(a)):
b:=N/lambda2:b:=sqrt(b*signum(b)):
ea:=evalf(a):eb:=evalf(b):
if signum(lambda1) = signum(lambda2) then
if evalf(lambda1) < 0 and evalf(lambda2) < 0 then
neupravenaKanonickaRce:=-neupravenaKanonickaRce;
end if;
if evalf(rhs(neupravenaKanonickaRce)) > 0 then
# Elipticka valcova plocha
if ea = eb then
nazevKvadriky:="rotacni valcova plocha";
else
nazevKvadriky:="elipticka valcova plocha";
end if;
kanonickaRce:=neupravenaKanonickaRce/rhs(neupravenaKanonickaRce);
elif evalf(rhs(neupravenaKanonickaRce)) < 0 then
# Imaginarni elipticka valcova plocha
nazevKvadriky:="imaginarni elipticka valcova plocha";
kanonickaRce:=neupravenaKanonickaRce/(-rhs(neupravenaKanonickaRce));
end if;
else
# Hyperbolicka valcova plocha
nazevKvadriky:="hyperbolicka valcova plocha";
kanonickaRce:=neupravenaKanonickaRce/rhs(neupravenaKanonickaRce);
if evalf(rhs(kanonickaRce)) < 0 then
kanonickaRce:=-kanonickaRce;
end if;
end if;
else
a:=1/lambda1:a:=sqrt(a*signum(a)):
b:=1/lambda2:b:=sqrt(b*signum(b)):
ea:=evalf(a):eb:=evalf(b):
if signum(lambda1) = signum(lambda2) then
# Primka nebo imaginarni ruznobezne roviny
nazevKvadriky:="primka (imaginarni ruznobezne roviny)";
if evalf(lambda1) < 0 and evalf(lambda2) < 0 then
neupravenaKanonickaRce:=-neupravenaKanonickaRce;
end if;
kanonickaRce:=neupravenaKanonickaRce;
else
# Dve ruznobezne roviny
nazevKvadriky:="dve ruznobezne roviny";
kanonickaRce:=factor(neupravenaKanonickaRce);
end if;
end if;
elif evalf(lambda1) <> 0 and evalf(lambda2) = 0 and evalf(lambda3) = 0 then
if evalf(G) = 0 and evalf(F) = 0 then # E = 0, H = N
neupravenaKanonickaRce:=lambda1*x^2=-N;
puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce;
if evalf(N) <> 0 then
a:=N/lambda1:a:=sqrt(a*signum(a)):
ea:=evalf(a):
if evalf(lambda1) < 0 then
neupravenaKanonickaRce:=-neupravenaKanonickaRce;
end if;
if evalf(rhs(neupravenaKanonickaRce)) > 0 then
# Dve rovnobezne roviny
nazevKvadriky:="dve rovnobezne roviny";
kanonickaRce:=factor(neupravenaKanonickaRce/rhs(neupravenaKanonickaRce));
elif evalf(rhs(neupravenaKanonickaRce)) < 0 then
# Imaginarni rovnobezne roviny
nazevKvadriky:="imaginarni rovnobezne roviny";
kanonickaRce:=neupravenaKanonickaRce/(-rhs(neupravenaKanonickaRce));
end if;
else
# Dvojnasobna rovina
a:=1/lambda1:a:=sqrt(a*signum(a)):
ea:=evalf(a):
if evalf(lambda1) < 0 then
neupravenaKanonickaRce:=-neupravenaKanonickaRce;
end if;
nazevKvadriky:="dvojnasobna rovina";
kanonickaRce:=neupravenaKanonickaRce;
end if;
else
#
# G <> 0 nebo F <> 0
# Parabolicka valcova plocha
nazevKvadriky:="parabolicka valcova plocha";
neupravenaKanonickaRce:=lambda1*x^2=-2*F*y-2*G*z;
puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce;
a:=1/lambda1:a:=sqrt(a*signum(a)):
ea:=evalf(a):
if (evalf(lambda1) < 0) then
neupravenaKanonickaRce:=-neupravenaKanonickaRce;
end if;
kanonickaRce:=neupravenaKanonickaRce;
end if;
end if;
end if;
if (delta <> 0 and A44 <> 0) or (delta = 0 and A44 <> 0) then
# Stredova kvadrika
S:=eval([m,n,p],solve(geneqns(submatrix(K,1..3,1..3),[m,n,p],evalm(-1*subvector(K,1..3,4))),{m,n,p}));
if zapnoutNumerickeVypocty = 1 then
S:=evalf(S);
end if;
end if;
hr:=proc(lambda,u)
global K;
if (evalf(lambda) <> 0) then
return rhs(op(op(3,(multiply(matrix(1,4,[u[1],u[2],u[3],0]),K,matrix(4,1,[x,y,z,1]))))));
else
return NULL;
end if;
end proc:
hlavniRovina1:=hr(lambda1,u1);
hlavniRovina2:=hr(lambda2,u2);
hlavniRovina3:=hr(lambda3,u3);
kresli(defaultSize);
end proc:
# KONEC HLAVNICH VYPOCTU
priklady:=[
"a) 7*x^2-13*y^2+6*z^2+24*x*y-12*x*z+12*y*z-84*x+90*y-24*z-63=0",
"b) 4*x^2+4*y^2+12*z^2+4*x*y-12*y*z+4*x+2*y+3*z=0",
"c) 1*x^2+9*y^2+16*z^2-6*x*y-8*x*z+24*y*z-4*z-2=0",
"d) x^2+2*y^2+z^2+2*x*y+10-2*y*z-6*x-8*y+2*z=0",
"e) 2*x^2+2*y^2+z^2-12-4*x+4*y=0",
"f) x^2+2*y^2+7-2*x*y+3*y*z-6*x+7*y+6*z=0",
"g) 5*x^2-4*y^2+z^2-8*x*y+6*x*z-8+2*x-8*y+6*z=0",
"h) 11*x^2+10*y^2+6*z^2-12*x*y+4*x*z-8*y*z-22*x-1=0",
"i) 9*x^2+4*y^2+z^2-12*x*y+6*x*z-4*y*z+3*x-2*y+z-3/2=0",
"j) x^2+2*y^2+4*z^2-2*x*y-4-4*y*z+2*x-2*y=0",
"k) 3*x^2-2*y^2-z^2+5*x*y-2*x*z+3*y*z-8*x+5*y-4*z-5=0",
"l) 5*x^2+5*y^2+5*z^2+30+4*x*z+3*y*z-14*x-13*y-17*z=0",
"m) 2*x^2+2*y^2+2*z^2+2*x*y-2*x*z+2*y*z-6*x+18*y+24*z=0",
"n) x^2+9*y^2+z^2-6*x*y+2*x*z-6*y*z+8*x-24*y+8*z+16=0",
"o) x^2+y^2+3*z^2+10*x*y+6*x*z+6*y*z-10*x-2*y-6*z+37=0",
"p) -1+x*y+x*z+y*z=0",
"q) 3*x^2-3*y^2+z^2+8*x*y-4*x*z-2*y*z-4*x+6*y+2*z=0",
"r) 15*x^2+15*y^2-2*z^2-34*x*y+15-30*x+34*y=0",
"s) 13*x^2+4*y^2+9*z^2+1+12*y*z+5*x-z=0",
"t) x^2+y^2+z^2+x*y+x*z+y*z-6*x-4*y+2*z+5=0",
"u) -x^2-4*y^2+9*z^2+4*x*y+8*x-16*y-16=0",
"v) 1/3*x^2+1/3*y^2+1/3*z^2-8/3*x+2*y-4/3*z+11/3=0",
"w) 9*x^2+2*y^2+9*z^2+6*sqrt(2)*x*y-18*x*z-6*sqrt(2)*y*z+3=0",
"x) -y^2+x*y-x*z-y*z+1+x+z+1=0",
"y) x^2+y^2+z^2-4*x-8*y-2*z+21=0",
"z) 5*x^2+8*y^2+5*z^2+4*x*y-8*x*z+4*y*z+27=0",
"1) 6*x^2-2*y^2+6*z^2+4*x*z+8*x-4*y-8*z+1=0"
]:
init:=proc()
global celyMMLtext, aktualniKrok, reference, stav, hlavniRovinap, osaKvadriky1p, osaKvadriky2p, osaKvadriky3p,
Vp, Vt, transformovanaKvadrikap, puvodniKvadrikap, Sp, St, prazdnop, defaultSize;
reference:=[];
celyMMLtext:="";
aktualniKrok:=1;
stav:=0;
Maplets:-Tools:-Set('doprovodnyText' = "");
# Maplets:-Tools:-Set('nazevKroku' = "");
Maplets:-Tools:-Set('MMLViewer' = "");
Sp:=NULL;St:=NULL;Vp:=NULL;Vt:=NULL;hlavniRovinap:=NULL;transformovanaKvadrikap:=NULL;puvodniKvadrikap:=NULL;osaKvadriky1p:=NULL;osaKvadriky2p:=NULL;osaKvadriky3p:=NULL;
prazdnop:=pointplot3d([0,0,0], color=white, axes=BOXED, view=[-defaultSize..defaultSize,-defaultSize..defaultSize,-defaultSize..defaultSize]):
end proc:
reinit:=proc(rceKvadriky)
global stav;
if stav = 0 then
init();
extrakceKoeficientu(rceKvadriky);
hlavniVypocty();
definiceMMLVypisu();
Maplets:-Tools:-Set('zoom'('value') = defaultSize);
zmenStav(1);
end if;
end proc:
zmenStav:=proc(novyStav)
global stav;
stav:=novyStav;
end proc:
nastavKvalitu:=proc()
global kvalita1, kvalita2;
if Maplets:-Tools:-Get('RBMI10'('value')) = true then
kvalita1:=10;
kvalita2:=15;
end if;
if Maplets:-Tools:-Get('RBMI11'('value')) = true then
kvalita1:=10;
kvalita2:=25;
end if;
if Maplets:-Tools:-Get('RBMI12'('value')) = true then
kvalita1:=10;
kvalita2:=35;
end if;
if Maplets:-Tools:-Get('RBMI13'('value')) = true then
kvalita1:=10;
kvalita2:=50;
end if;
end proc:
prepniNumerickeVypocty:=proc()
global zapnoutNumerickeVypocty;
if zapnoutNumerickeVypocty = 0 then
zapnoutNumerickeVypocty:=1;
else
zapnoutNumerickeVypocty:=0;
end if;
if stav = 1 then
definiceMMLVypisu();
end if;
end proc:
upravPriklad:=proc()
local priklad;
priklad:=Maplets:-Tools:-Get('LB1'('value'));
return parse(substring(priklad,4..length(priklad)));
end proc:
#nastavVelikostPisma:=proc()
# local i, j;
# j:=9;
# for i in [RBMI1, RBMI2, RBMI3, RBMI4, RBMI5, RBMI6, RBMI7, RBMI8, RBMI9] do
# j:=j+1;
# if Maplets:-Tools:-Get('i'('value')) = true then
# Maplets:-Tools:-Set('MMLViewer' = NULL);
# Maplets:-Tools:-Set('MMLViewer'('fontsize') = j);
# end if;
# end do;
#end proc:
maplet:=Maplet(
onstartup = 'A1',
Window['hlavni']('menubar' = 'MB1', 'resizable' = 'false', 'title' = "Vysetreni kvadrik", [
BoxLayout(
BoxColumn(
"Zadejte obecnou rovnici kvadriky:",
TextField['rceKvadriky'](""),
# TextField['nazevKroku'](),
TextBox['doprovodnyText']('height' = 13, 'editable' = false),
MathMLViewer['MMLViewer']('fontsize' = 12, 'width' = 600, 'height' = 250),
[
Button['btnMain']("Zahajit vypocet", 'onclick' = 'A2'),
Button['btnNew']("Zadat novou rovnici", 'onclick' = 'A3', 'enabled' = 'false'),
Button['btnChoose']("Vyber prikladu", RunWindow('vyberPrikladu'))
]
),
BoxColumn('halign'='left','valign'='none',
Plotter['plotter']('width' = 300, 'height' = 300),
Slider['zoom'](1..51, defaultSize, 'showticks', 'majorticks'=5, 'minorticks'=1, 'snapticks'=false, 'onchange' = 'A6', 'visible' = false),
CheckBox['ChB1']("zobrazit transformovanou kvadriku", 'onchange' = 'A5', 'enabled' = 'false'),
CheckBox['ChB2']("zobrazit puvodni kvadriku", 'onchange' = 'A5', 'enabled' = 'false'),
CheckBox['ChB3']("zobrazit hlavni roviny", 'onchange' = 'A5', 'enabled' = 'false'),
CheckBox['ChB4']("zobrazit osy", 'onchange' = 'A5', 'enabled' = 'false'),
CheckBox['ChB5']("zobrazit stred nebo vrchol", 'onchange' = 'A5', 'enabled' = 'false')
)
)
]),
Window['vyberPrikladu']([
["Vyberte si jeden z prikladu:"],
[ListBox['LB1'](priklady, 'value' = priklady[1])],
[Button("OK", 'onclick' = 'A4'), Button("Storno", CloseWindow('vyberPrikladu'))]
]),
MenuBar['MB1'](
Menu("Nastaveni",
CheckBoxMenuItem("Ciselne vysledky", 'onclick' = 'A9', 'value' = 'false'),
# Menu("Velikost pisma v algebraickem okne",
# RadioButtonMenuItem['RBMI1']("10", 'group'='BG2'),
# RadioButtonMenuItem['RBMI2']("11", 'group'='BG2'),
# RadioButtonMenuItem['RBMI3']("12", 'group'='BG2'),
# RadioButtonMenuItem['RBMI4']("13", 'group'='BG2', 'value' = 'true'),
# RadioButtonMenuItem['RBMI5']("14", 'group'='BG2'),
# RadioButtonMenuItem['RBMI6']("15", 'group'='BG2'),
# RadioButtonMenuItem['RBMI7']("16", 'group'='BG2'),
# RadioButtonMenuItem['RBMI8']("17", 'group'='BG2'),
# RadioButtonMenuItem['RBMI9']("18", 'group'='BG2')
# ),
Menu("Kvalita vykreslovani",
RadioButtonMenuItem['RBMI10']("nizka", 'group'='BG1'),
RadioButtonMenuItem['RBMI11']("stredni", 'group'='BG1', 'value' = 'true'),
RadioButtonMenuItem['RBMI12']("vysoka", 'group'='BG1'),
RadioButtonMenuItem['RBMI13']("nejlepsi", 'group'='BG1')
)
)
),
ButtonGroup['BG1']('onchange' = 'A7'),
# ButtonGroup['BG2']('onchange' = 'A8'),
Action['A1'](
RunWindow('hlavni'),
Evaluate(function = 'init()'),
Evaluate('plotter'= 'prazdnop')
),
Action['A2'](
Evaluate(function = 'dalsiKrok()')
),
Action['A3'](
SetOption('btnMain'('caption') = "Zahajit vypocet"),
SetOption('btnNew'('enabled') = 'false'),
SetOption('ChB1'('enabled') = 'false'),
SetOption('ChB2'('enabled') = 'false'),
SetOption('ChB3'('enabled') = 'false'),
SetOption('ChB4'('enabled') = 'false'),
SetOption('ChB5'('enabled') = 'false'),
SetOption('ChB1'('value') = 'false'),
SetOption('ChB2'('value') = 'false'),
SetOption('ChB3'('value') = 'false'),
SetOption('ChB4'('value') = 'false'),
SetOption('ChB5'('value') = 'false'),
SetOption('zoom'('visible') = 'false'),
SetOption('zoom'('value') = defaultSize),
SetOption('btnChoose'('enabled') = 'true'),
SetOption('btnMain'('enabled') = 'true'),
SetOption('rceKvadriky'('editable') = 'true'),
SetOption('rceKvadriky'('focus') = 'true'),
Evaluate(function = 'init()'),
Evaluate('plotter'= 'prazdnop')
),
Action['A4'](
Evaluate('rceKvadriky' = 'upravPriklad()'),
# SetOption('btnMain'('caption') = "Zahajit vypocet"),
Evaluate(function = 'init()'),
CloseWindow('vyberPrikladu')
),
Action['A5'](
Evaluate(function = 'prekresli()')
),
Action['A6'](
Evaluate(function = 'kresli(zoom)'),
Evaluate(function = 'prekresli()')
),
Action['A7'](
Evaluate(function = 'nastavKvalitu()'),
Evaluate(function = 'kresli(zoom)'),
Evaluate(function = 'prekresli()')
),
Action['A8'](
Evaluate(function = 'nastavVelikostPisma()')
),
Action['A9'](
Evaluate(function = 'prepniNumerickeVypocty()')
)
):
Maplets[Display](maplet);
# Warning, the protected names norm and trace have been redefined and unprotected
# Warning, the name changecoords has been redefined