Animace grafu kvadratické funkce II.

Následující aplet umožňuje názorně pochopit základní princip transformace grafu funkce y = a.(x^2) + bx + c. 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ž graf se uloží právě zobrazený graf 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ů.
Důležité upozornění: Při přepnutí typu rovnice funkce z Obecné na Vrcholovou resp. naopak zůstanou hodnoty koeficientů a, b a c nezměněny! Proto se změní i vykreslovaný graf funkce (změní se posun po ose x)!

© Jaroslav Reichl, 2008

Příprava pro vykreslení grafu

jmenosouboru="kv_fce_.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;

KvadratickaFunkce=Manipulate[
If[typrovnice=="Obecná",
{funkce[x_]=a*(x^2)+b x+c,
nadpis="Graf funkce y = a.(x^2) + b.x + c"},
{funkce[x_]=a (((x+b))^2)+c,
nadpis="Graf funkce y = a.(x + b)^2 + c"}];
If[reference,
referencnifunkce[x_]=(x^2),
referencnifunkce[x_]=0];
predpis="y = ";
If[typrovnice=="Obecná",
{If[a≠0,
{If[a≠1,
predpis=StringJoin[predpis,ToString[Style[ToString[a],abarva],StandardForm]],
""],
If[b≠0,
If[b>0,
predpis=StringJoin[predpis,ToString[Style["(x^2) + ",barva],StandardForm]],
predpis=StringJoin[predpis,ToString[Style["(x^2) - ",barva],StandardForm]]],
predpis=StringJoin[predpis,ToString[Style["(x^2) ",barva],StandardForm]]]},
If[b≠0,
If[b<0,
predpis=StringJoin[predpis,ToString[Style["- ",barva],StandardForm]],
""],
""]];
If[b≠1&&b≠0,
predpis=StringJoin[predpis,ToString[Style[ToString[Abs[b]],bbarva],StandardForm]],
""];
If[b≠0,
predpis=StringJoin[predpis,ToString[Style["x",barva],StandardForm]],
""];
If[a≠0∨b≠0,
If[c≠0,
{If[c>0,
predpis=StringJoin[predpis,ToString[Style[" + ",barva],StandardForm]],
predpis=StringJoin[predpis,ToString[Style[" - ",barva],StandardForm]]],
predpis=StringJoin[predpis,ToString[Style[ToString[Abs[c]],cbarva],StandardForm]]},
""],
predpis=StringJoin[predpis,ToString[Style[ToString[c],cbarva],StandardForm]]]},

{If[a≠0,
{If[a≠1,
predpis=StringJoin[predpis,ToString[Style[ToString[a],abarva],StandardForm]],
""],
If[b≠0,
If[b>0,
predpis=StringJoin[predpis,ToString[Style["(x + ",barva],StandardForm]],
predpis=StringJoin[predpis,ToString[Style["(x - ",barva],StandardForm]]],
predpis=StringJoin[predpis,ToString[Style["(x^2) ",barva],StandardForm]]]}];
If[a≠0&&b≠0,
{predpis=StringJoin[predpis,ToString[Style[ToString[Abs[b]],bbarva],StandardForm]],
predpis=StringJoin[predpis,ToString[Style[")^2",barva],StandardForm]]},
""];
If[a≠0,
If[c≠0,
{If[c>0,
predpis=StringJoin[predpis,ToString[Style[" + ",barva],StandardForm]],
predpis=StringJoin[predpis,ToString[Style[" - ",barva],StandardForm]]],
predpis=StringJoin[predpis,ToString[Style[ToString[Abs[c]],cbarva],StandardForm]]},
""],
predpis=StringJoin[predpis,ToString[Style[ToString[c],cbarva],StandardForm]]]}];

If[a≠0,
{reseni=Solve[funkce'[x]==0,x],
x0=x/.reseni[[1]],
y0=funkce[x0],
vrchol=Point[{x0,y0}],
kotovanivrcholu=Line[{{0,y0},{x0,y0},{x0,0}}]}];
reseni=Solve[funkce[x]==0,x];
If[reseni≠{},
{xp1=x/.reseni[[1]],
If[a≠0,
xp2=x/.reseni[[2]],
xp2=0]
If[Im[xp1]==Im[xp2],
{prusecikx1=Point[{xp1,0}],
prusecikx2=Point[{xp2,0}]}]}];
yp=funkce[0];
pruseciky=Point[{0,yp}];

grafik=Deploy[Show[
If[souradniceos,
Plot[{referencnifunkce[x],funkce[x]},{x,x1,x2},PlotStyle->{{RGBColor[0,0,0],Thickness[0.002]},{RGBColor[1,0,0],Thickness[0.008]}},PlotLabel->Style[nadpis,18,barva,FontFamily->Times,Bold],Ticks->Automatic,Axes->True,AxesLabel->{"x","y"},AxesOrigin->{0,0},PlotRange->{{x1,x2},{y1,y2}},ImageSize->400],
Plot[{referencnifunkce[x],funkce[x]},{x,x1,x2},PlotStyle->{{RGBColor[0,0,0],Thickness[0.002]},{RGBColor[1,0,0],Thickness[0.008]}},PlotLabel->Style[nadpis,18,barva,FontFamily->Times,Bold],Ticks->None,Axes->True,AxesLabel->{"x","y"},AxesOrigin->{0,0},PlotRange->{{x1,x2},{y1,y2}},ImageSize->400]],
Graphics[{
If[zobrazitpredpis,
Text[Style[predpis,15,FontFamily->Times],{0.95x1,1.1y1},{Left,Center}],
Text[""]],
If[zobrazitvrchol,
If[a≠0,
{{barvav,PointSize[velikost],vrchol},
Text[Style[StringJoin["Vrchol paraboly: V = [",ToString[Round[x0,0.01]],"; ",ToString[Round[y0,0.01]],"]"],15,barvav,FontFamily->Times],{0.05x2,1.1y1},{Left,Center}]},
Text[Style["Vrchol N E E X I S T U J E !",15,barvav,FontFamily->Times],{0.05x2,1.1y1},{Left,Center}]],
Text[""]],
If[zobrazitpx,
If[a≠0,
If[Im[xp1]==Im[xp2],
{{barvapx,PointSize[velikost],prusecikx1},
{barvapx,PointSize[velikost],prusecikx2},
Text[Style[StringJoin["Průsečíky s osou x: (Subscript[P, x1]) = [",ToString[Round[xp1,0.01]],"; 0] a (Subscript[P, x2]) = [",ToString[Round[xp2,0.01]],"; 0]"],15,barvapx,FontFamily->Times],{0.95x1,1.3y1},{Left,Center}]},
Text[Style["Průsečíky s osou x N E E X I S T U J Í !",15,barvapx,FontFamily->Times],{0.95x1,1.3y1},{Left,Center}]],
If[b≠0&&typrovnice=="Obecná",
{{barvapx,PointSize[velikost],prusecikx1},
Text[Style[StringJoin["Průsečík s osou x je jen jeden: (Subscript[P, x1]) = [",ToString[Round[xp1,0.01]],"; 0] - funkce není kvadratická!"],15,barvapx,FontFamily->Times],{0.95x1,1.3y1},{Left,Center}]},
Text[Style["Průsečíky s osou x N E E X I S T U J Í !",15,barvapx,FontFamily->Times],{0.95x1,1.3y1},{Left,Center}]]],
Text[""]],
If[zobrazitpy,
{{barvapy,PointSize[velikost],pruseciky},
Text[Style[StringJoin["Průsečík s osou y: (Subscript[P, y]) = [0; ",ToString[Round[yp,0.01]],"]"],15,barvapy,FontFamily->Times],{0.95x1,1.5y1},{Left,Center}]},
Text[""]],
If[monotonie,
If[a>0,
{Text[Style[StringJoin["(-∞; ",ToString[Round[x0,0.01]],") ... klesající"],15,barva,FontFamily->Times],{0.95x1,1.7y1},{Left,Center}],
Text[Style[StringJoin["(",ToString[Round[x0,0.01]],"; ∞) ... rostoucí"],15,barva,FontFamily->Times],{0.05x2,1.7y1},{Left,Center}]},
If[a<0,
{Text[Style[StringJoin["(-∞; ",ToString[Round[x0,0.01]],") ... rostoucí"],15,barva,FontFamily->Times],{0.95x1,1.7y1},{Left,Center}],
Text[Style[StringJoin["(",ToString[Round[x0,0.01]],"; ∞) ... klesající"],15,barva,FontFamily->Times],{0.05x2,1.7y1},{Left,Center}]},
Text[""]]],
Text[""]]
}],
FormatType->StandardForm,
PlotRange->{{x1,x2},{y1-deltay,y2}},ImageSize->520
]],

{{a,1,Style["a",20,abarva]},-3,3,0.1},
{{b,0,Style["b",20,bbarva]},-4,4,0.1},
{{c,0,Style["c",20,cbarva]},-5,5,0.1},
Delimiter,
{{typrovnice,"Obecná",Style["Rovnice funkce:",15,barva,FontFamily->Times]},{"Obecná","Vrcholová"}},
Delimiter,
Item[Style["Zobrazit",15,barva,FontFamily->Times],Alignment->Left],
{{zobrazitpredpis,True,Style["- předpis",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{reference,True,Style["- y = (x^2)",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{souradniceos,False,Style["- dělení os",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitvrchol,True,Style["- vrchol V",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{monotonie,False,Style["- monotonii",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
{{zobrazitpx,False,Style["- průsečík s x",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitpy,False,Style["- průsečík s y",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
Button[" Ulož graf ",{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["Graf kvadratické funkce",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.

KvadratickaFunkce