Animace řešení kvadratické rovnice

Následující aplet umožňuje názorně pochopit řešení kvadratické rovnice a.(x^2) + bx + c = 0. Pomocí posuvníků lze nastavit libovolnou kombinaci koeficientů a, b a c. Předdefinované rozsahy koeficientů může uživatel znalý Mathematicy měnit.
Tlačítkem Ulož řešení se uloží právě zobrazené "bílé" okno do aktuální složky (složka, v níž je uložen tento notebook) pod jménem, které je uloženo v proměnné jmenosouboru. K tomuto jménu souboru je při opakovaném ukládání grafu přidáváno pořadové číslo.
Pozor! Při každém spuštění tohoto apletu se začínají soubory číslovat opět od jedné! Tak může dojít k přepsání minule uložených obrázků.

© Jaroslav Reichl, 2008

Příprava pro vykreslení grafu

jmenosouboru="kv_rce_.jpg";
cesta=NotebookDirectory[];
pocetulozeni=0;

abarva=Darker[Red];
bbarva=Darker[Blue,0.2];
cbarva=Orange;
barva=Black;
barvav=Darker[Green,0.2];
barvapx=Lighter[Blue,0.4];
barvapy=Brown;

velikost=0.02;

x1=-10;x2=10;
y1=-10;y2=10;
deltay=8;

KvadratickaRovnice=Manipulate[
rovnice=a (x^2)+b x+c==0;
If[a≠0,
rovnicenormovana=(x^2)+Round[(b/a),0.01]x+Round[(c/a),0.01]==0];
vypis="";
If[a≠0,
{If[a≠1,
vypis=StringJoin[vypis,ToString[Style[ToString[a],abarva],StandardForm]],
""],
If[b≠0,
If[b>0,
vypis=StringJoin[vypis,ToString[Style["(x^2) + ",barva],StandardForm]],
vypis=StringJoin[vypis,ToString[Style["(x^2) - ",barva],StandardForm]]],
vypis=StringJoin[vypis,ToString[Style["(x^2) ",barva],StandardForm]]]},
If[b≠0,
If[b<0,
vypis=StringJoin[vypis,ToString[Style["- ",barva],StandardForm]],
""],
""]];
If[b≠1&&b≠0,
vypis=StringJoin[vypis,ToString[Style[ToString[Abs[b]],bbarva],StandardForm]],
""];
If[b≠0,
vypis=StringJoin[vypis,ToString[Style["x",barva],StandardForm]],
""];
If[a≠0∨b≠0,
If[c≠0,
{If[c>0,
vypis=StringJoin[vypis,ToString[Style[" + ",barva],StandardForm]],
vypis=StringJoin[vypis,ToString[Style[" - ",barva],StandardForm]]],
vypis=StringJoin[vypis,ToString[Style[ToString[Abs[c]],cbarva],StandardForm]]},
""],
vypis=StringJoin[vypis,ToString[Style[ToString[c],cbarva],StandardForm]]];
vypis=StringJoin[vypis," = 0"];

If[a≠0,
{postup="D = ",
If[b≠0,
{If[b<0,
{postup=StringJoin[postup,ToString[Style["(",barva],StandardForm]],
postup=StringJoin[postup,ToString[Style[ToString[b],bbarva],StandardForm]],
postup=StringJoin[postup,ToString[Style[")",barva],StandardForm]]},
postup=StringJoin[postup,ToString[Style[ToString[b],bbarva],StandardForm]]],
postup=StringJoin[postup,ToString[Style["\!\(\*SuperscriptBox[\(\\ \), \(2\)]\)",barva],StandardForm]]}],
If[c≠0,
{postup=StringJoin[postup,ToString[Style[" - 4*",barva],StandardForm]],
If[a<0,
{postup=StringJoin[postup,ToString[Style["(",barva],StandardForm]],
postup=StringJoin[postup,ToString[Style[ToString[a],abarva],StandardForm]],
postup=StringJoin[postup,ToString[Style[")",barva],StandardForm]]},
postup=StringJoin[postup,ToString[Style[ToString[a],abarva],StandardForm]]],
postup=StringJoin[postup,ToString[Style["*",barva],StandardForm]],
If[c<0,
{postup=StringJoin[postup,ToString[Style["(",barva],StandardForm]],
postup=StringJoin[postup,ToString[Style[ToString[c],cbarva],StandardForm]],
postup=StringJoin[postup,ToString[Style[")",barva],StandardForm]]},
postup=StringJoin[postup,ToString[Style[ToString[c],cbarva],StandardForm]]]}],
If[b≠0∨(b==0&&c≠0),
postup=StringJoin[postup,ToString[Style[" = ",barva],StandardForm]]],
diskriminant=(b^2)-4a c,
postup=StringJoin[postup,ToString[Style[ToString[diskriminant],barva],StandardForm]],
postup2=StringJoin["\!\(\*SubscriptBox[\(x\), \(1, \\ 2\)]\) = ",ToString[Round[(1/(2 a)),0.01](-b±Round[(Sqrt[diskriminant]),0.01]),TraditionalForm]]},
""];

reseni=Solve[rovnice,x];
If[a≠0,
{koren1=x/.reseni[[1]],
koren2=x/.reseni[[2]],
If[koren1==koren2,
{infookorenech="Rovnice má jeden dvojnásobný reálný kořen!",
textP=StringJoin["{",ToString[Round[koren1,0.01]],"}"]},
If[Im[koren1]==Im[koren2],
{infookorenech="Rovnice má dva reálné kořeny!",
textP=StringJoin["{",ToString[Round[koren1,0.01]],"; ",ToString[Round[koren2,0.01]],"}"]},
If[oborreseni=="ℝ",
{infookorenech="Rovnice nemá v množině reálných čísel žádný kořen!",
textP="∅"},
{infookorenech="Rovnice má v množině komplexních čísel dva navzájem komplexně sdružené kořeny!",
textP=StringJoin["{",ToString[Round[koren1,0.01], TraditionalForm],"; ",ToString[Round[koren2,0.01],TraditionalForm],"}"]}]]]},
{If[reseni≠{},
{koren1=x/.reseni[[1]],
If[NumericQ[koren1],
{infookorenech="ZADANÁ ROVNICE NENÍ KVADRATICKÁ a má jedno řešení!",
textP=StringJoin["{",ToString[Round[koren1,0.01]],"}"]},
{infookorenech="ZADANÁ ROVNICE NENÍ KVADRATICKÁ a má nekonečně mnoho řešení!",
textP=oborreseni,
koren1=""}]},
{infookorenech="ZADANÁ ROVNICE NENÍ KVADRATICKÁ a nemá žádné řešení!",
textP="∅",
koren1=""}]}];

grafik=Deploy[Show[
Graphics[{
Text[Style[vypis,45,FontFamily->Times],{0.5(x1+x2),0.9y2},{Center,Center}],
If[a≠0&&normovanarovnice,
Text[Style[ToString[rovnicenormovana,TraditionalForm],30,FontFamily->Times],{0.5(x1+x2),0.7y2},{Center,Center}],
Text[""]],
Text[Style["ŘEŠENÍ:",25,Red,FontFamily->Times,Bold,Underlined],{0.95x1,0.5y2},{Left,Center}],
If[zobrazitpostup&&a≠0,
{Text[Style[postup,25,FontFamily->Times],{0.95x1,0.3y2},{Left,Center}],
Text[Style[postup2,25,FontFamily->Times],{0.95x1,0.1y2},{Left,Center}]},
Text[""]],

If[a≠0,
If[oborreseni=="ℂ"∨(Element[koren1,Reals]&&oborreseni=="ℝ"),
{Text[Style[StringJoin["(Subscript[x, 1]) = ",ToString[Round[koren1,0.01],TraditionalForm]],20,FontFamily->Times],{0.95x1,0.1y1},{Left,Center}],
Text[Style[StringJoin["(Subscript[x, 2]) = ",ToString[Round[koren2,0.01],TraditionalForm]],20,FontFamily->Times],{0.05x2,0.1y1},{Left,Center}]},
Text[""]],
If[koren1≠"",
Text[Style[StringJoin["x = ",ToString[Round[koren1,0.01],TraditionalForm]],20,FontFamily->Times],{0.95x1,0.1y1},{Left,Center}],
Text[""]]],

If[detailykorenu,
Text[Style[infookorenech,15,FontFamily->Times],{0.95x1,0.3y1},{Left,Center}],
Text[""]],

If[odp,
{Text[Style[StringJoin["O = D = ",oborreseni],18,FontFamily->Times,Bold],{0.95x1,0.4y1},{Left,Center}],
Text[Style[StringJoin["P = ",textP],18,FontFamily->Times,Bold],{0.25x1,0.4y1},{Left,Center}]},
Text[""]],

If[a≠0&&vietovyvzorce,
{Text[Style["VIÉTOVY VZORCE:",25,Red,FontFamily->Times,Bold,Underlined],{0.95x1,0.7y1},{Left,Center}],
Text[Style[StringJoin["(Subscript[x, 1]) + (Subscript[x, 2]) = ",ToString[Round[koren1+koren2,0.01],TraditionalForm]],20,FontFamily->Times],{0.95x1,0.9y1},{Left,Center}],
Text[Style[StringJoin["(Subscript[x, 1]) * (Subscript[x, 2]) = ",ToString[Round[koren1*koren2,0.01],TraditionalForm]],20,FontFamily->Times],{0.05x2,0.9y1},{Left,Center}]},
Text[""]]}],
FormatType->StandardForm,
PlotRange->{{x1,x2},{y1,y2}},ImageSize->500
]],

{{a,1,Style["a",20,abarva]},-5,5,0.1},
{{b,0,Style["b",20,bbarva]},-5,5,0.1},
{{c,0,Style["c",20,cbarva]},-5,5,0.1},
Delimiter,
{{oborreseni,"ℝ",Style["obor řešení",15,barva,FontFamily->Times]},{"ℝ","ℂ"},ControlType->RadioButton},
Delimiter,
Item[Style["Zobrazit",15,barva,FontFamily->Times,Bold,Underlined],Alignment->Left],
{{zobrazitpostup,True,Style["výpočet",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{detailykorenu,True,Style["detaily kořenů",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{odp,True,Style["O, D, P",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
{{normovanarovnice,False,Style["normovaně",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{vietovyvzorce,False,Style["Viétovy vzorce",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
Dynamic[Plot[a (x^2)+b x+c,{x,-10,10},ImageSize->300,PlotRange->{{-10,10},{-10,10}},AxesOrigin->{0,0},AxesLabel->{"x","y"}]],
Delimiter,
Button[" Ulož řešení ",{pocetulozeni=pocetulozeni+1,Export[StringInsert[StringJoin[cesta,jmenosouboru],ToString[pocetulozeni],-5],grafik]},ImageSize->{100,Automatic}],
ControlPlacement->Left,
FrameLabel->{Style["© Jaroslav Reichl, 2008",10,Black,FontFamily->Times],"",Style["Řešení kvadratické rovnice",25,Black,FontFamily->Times],""}];

Spuštění animace
Zpracujte běžným způsobem následující buňku a na dotaz, který se objeví, odpovězte ANO.

KvadratickaRovnice