Více o funkci
Manipulate

Antonín Slavík
Matematicko-fyzikální fakulta UK

Manipulate – připomenutí

Manipulate[výraz závislý na parametrech,{(Subscript[p, 1]),obor hodnot (Subscript[p, 1])},{(Subscript[p, 2]),obor hodnot (Subscript[p, 2])},...]

Manipulate[ImageRotate[,α Degree],{α,0,360}]

Místo {p,obor hodnot p} lze psát {{p,počáteční hodnota p},obor hodnot p} nebo {{p,počáteční hodnota p,popis ovládacího prvku},obor hodnot p}

Manipulate[ImageRotate[,α Degree],{{α,45,"Úhel"},0,360}]

Manipulate si všímá pouze parametrů, které se explicitně vyskytují v zadaném výrazu:

f[x_]:=Sin[a x]
Manipulate[Plot[f[x],{x,0,10}],{a,1,5}]

f[a_,x_]:=Sin[a x]
Manipulate[Plot[f[a,x],{x,0,10}],{a,1,5}]

Clear[f]

Přehled ovládacích prvků

Podle zadaného oboru hodnot Mathematica automaticky určí, jaký ovládací prvek se použije k nastavování hodnot parametru.

Manipulator

Je-li parametr zadán ve tvaru {p,min,max} nebo {p,min,max,krok}, použije se ovládací prvek Manipulator.

Manipulate[Plot[{Sin[k x],Sin[k x0]+k Cos[k x0] (x-x0)},{x,0,4 π},PlotStyle->{{Thick,Blue},{Thick,Dashed,Red}},PlotRange->{-3,3},Epilog->{PointSize[Large],Red,Point[{x0,Sin[k x0]}]}],{{x0,2,"bod dotyku"},0,4 π},{{k,1,"úhlová frekvence"},1,4}]

Držíme-li při posouvání klávesu Alt, mění se hodnoty pomaleji (přidáním Ctrl nebo Shift ještě pomaleji).

Příklad: Hypocykloida = dráha pevně zvoleného bodu na obvodu kružnice, která se valí po vnitřní straně obvodu jiné kružnice.

f[n_][t_]:=1/n{(n-1)Cos[t]-Cos[(n-1)t],(n-1)Sin[t]+Sin[(n-1)t]};
hypocykloida[n_][tmax_]:=ParametricPlot[f[n][t],{t,0,tmax},PlotRange->{{-1,1},{-1,1}},PlotStyle->Blue,Epilog->{Circle[],Circle[1/n{(n-1)Cos[tmax],(n-1)Sin[tmax]},1/n],Blue,PointSize[Large],Point[f[n][tmax]]}]

Manipulate[hypocykloida[n][tmax],{{n,3,"poměr velikostí"},3,10,1},{tmax,0.01,2Pi}]

Manipulator je zabudovaná funkce, která generuje příslušný ovládací prvek (Manipulate ji používá automaticky).

Manipulator[0.5]

Options[Manipulator]

Manipulator[0.5,Appearance->"Open"]

Manipulator[0.5,Appearance->"Labeled"]

Manipulator[0.5,Appearance->"Open",ContinuousAction->False]

Manipulator[0.5,Appearance->"Open",AutoAction->True]

Manipulator[0.5,ImageSize->Large]

Všechny volby funkce Manipulator lze používat také uvnitř Manipulate:

Manipulate[ImageRotate[,α Degree],{α,0,360,Appearance->"Labeled",ContinuousAction->False}]

ContinuousAction->False se hodí v případě, kdy je vyhodnocování výrazu uvnitř Manipulate časově náročné.

Animator

Je-li parametr zadán ve tvaru {p,min,Infinity} nebo {p,min,Infinity,krok}, použije se ovládací prvek Animator.

Příklad: Hypocykloida s iracionálním poměrem velikostí.

Manipulate[hypocykloida[E][tmax],{tmax,0.01,Infinity,AnimationRunning->False}]

Options[Animator]

Manipulate[hypocykloida[E][tmax],{tmax,0.01,Infinity,AnimationRunning->False,AnimationRate->2,AppearanceElements->{"ProgressSlider","PlayPauseButton","ResetButton"}}]

Checkbox

Je-li parametr zadán ve tvaru {p,{True,False}}, použije se ovládací prvek CheckBox.

Příklad: Aproximace obsahu kruhu pomocí vepsaných pravidelných n-úhelníků.

Manipulate[Graphics[{Text[Style[StringForm["Obsah ``-úhelníku je ``",n,N[n Sin[(π/n)]Cos[(π/n)]]],FontSize->18],{0,-1.2}],Thick,Blue,Circle[],Yellow,EdgeForm[Black],Polygon[Table[{Cos[((k 2 π)/n)],Sin[((k 2 π)/n)]},{k,0,n-1}]],Black,If[t,Table[Line[{{0,0},{Cos[((k 2 π)/n)],Sin[((k 2 π)/n)]}}],{k,0,n-1}],{}]}],{{n,5,"počet stran"},3,50,1,Appearance->"Labeled"},{{t,False,"triangulace"},{True,False}}]

ColorSlider

Je-li parametr zadán ve tvaru {p,barva}, použije se ovládací prvek ColorSlider.

Manipulate[Graphics[{Text[Style[StringForm["Obsah ``-úhelníku je ``",n,N[n(Sin[(π/n)] Cos[(π/n)])]],FontSize->18],{0,-1.2}],Thick,Blue,Circle[],barva,EdgeForm[Black],Polygon[Table[{Cos[((k 2 π)/n)],Sin[((k 2 π)/n)]},{k,0,n-1}]],Black,If[t,Table[Line[{{0,0},{Cos[((k 2 π)/n)],Sin[((k 2 π)/n)]}}],{k,0,n-1}],{}]}],{{n,5,"počet stran"},3,50,1,Appearance->"Labeled"},{{t,False,"triangulace"},{True,False}},{barva,Yellow}]

SetterBar a PopupMenu

Je-li parametr zadán ve tvaru {p,seznam  přípustných  hodnot} a seznam není příliš dlouhý, použije se ovládací prvek SetterBar.

Manipulate[ImageEffect[,efekt],{efekt,{"Solarization","OilPainting","Embossing"}}]

Options[SetterBar]

Manipulate[ImageEffect[,efekt],{efekt,{"Solarization","OilPainting","Embossing"},Appearance->"Vertical",BaseStyle->{FontFamily->"Arial",FontSize->14}}]

Prvky seznamu mohou být libovolné výrazy, např. obrázky:

Manipulate[ImageEffect[o,{"OilPainting",x}],{o,{,,}},{x,1,10,1}]

Je-li seznam přípustných hodnot delší, použije se ovládací prvek PopupMenu:

Manipulate[ImageEffect[,efekt],{efekt,{"Charcoal","OilPainting","Embossing","Solarization","Noise","SaltPepperNoise"}}]

LocatorPane

Je-li parametr zadán ve tvaru {p,Locator}, použije se ovládací prvek LocatorPane.

Napoleonova věta: Sestrojíme-li nad stranami libovolného trojúhelníka rovnostranné trojúhelníky, pak jejich těžiště jsou ve vrcholech rovnostranného trojúhelníka.

ConstructEquilateralTriangle[{m1_,n1_},{m2_,n2_}]:={{m1,n1},{m2,n2},RotationTransform[-(π/3),{m1,n1}][{m2,n2}]}
centroid[s_]:=Total[s]/Length[s]
Manipulate[Graphics[{Yellow,
Triangle[t1=ConstructEquilateralTriangle[pt1,pt2]],Triangle[t2=ConstructEquilateralTriangle[pt2,pt3]],Triangle[t3=ConstructEquilateralTriangle[pt3,pt1]],Red,Dashed,Thick,Line[Map[centroid,{t1,t2,t3,t1}]]},PlotRange->{{-6,6},{-6,6}}],
{{pt1,{3,0}},Locator},{{pt2,{-2,2}},Locator},{{pt3,{-3,0}},Locator}]

Zadáme-li jako počáteční hodnotu seznam n dvojic, pak bude parametr chápán jako seznam obsahující souřadnice n lokátorů. Je-li navíc zadáno LocatorAutoCreate->True, pak lze pomocí Alt a myši přidávat nebo odebírat lokátory.

Manipulate[Graphics[{Text[Style[StringForm["Délka lomené čáry je ``",N[Sum[Norm[pts[[i+1]]-pts[[i]]],{i,1,Length[pts]-1}]]],FontSize->18],{0,5},{0,1}],Line[pts]},PlotRange->{{-5,5},{-5,5}}],{{pts,{{-4,-1},{-2,1},{0,-1},{2,1},{4,-2}}},Locator,LocatorAutoCreate->True}]

Options[LocatorPane]

Vzhled lokátorů lze změnit pomocí volby Appearance:

g=Graphics[{Blue,EdgeForm[Black],Opacity[0.5],Disk[{0,0},0.1]},ImageSize->10];

Manipulate[Graphics[{Text[Style[StringForm["Délka lomené čáry je ``",N[Sum[Norm[pts[[i+1]]-pts[[i]]],{i,1,Length[pts]-1}]]],FontSize->18],{0,5},{0,1}],Line[pts]},PlotRange->{{-5,5},{-5,5}}],{{pts,{{-4,-1},{-2,1},{0,-1},{2,1},{4,-2}}},Locator,LocatorAutoCreate->True,Appearance->g}]

Číslované lokátory:

Manipulate[Graphics[{Text[Style[StringForm["Délka lomené čáry je ``",N[Sum[Norm[pts[[i+1]]-pts[[i]]],{i,1,Length[pts]-1}]]],FontSize->18],{0,5},{0,1}],Line[pts],EdgeForm[Black],FaceForm[LightBlue],Table[{Disk[pts[[i]],0.3],Text[Style[i,FontSize->14],pts[[i]]]},{i,1,Length[pts]}]},PlotRange->{{-5,5},{-5,5}}],{{pts,{{-4,-1},{-2,1},{0,-1},{2,1},{4,-2}}},Locator,LocatorAutoCreate->True,Appearance->None}]

Příklad: Cyklista jede na kole délky L, známe dráhu jeho zadního kola. Jak vypadá dráha předního kola?

Module[{back,front,pts},Manipulate[back=Interpolation[Transpose[{Range[0,1,1/(Length[pts]-1)],pts}], Method->"Spline"][t];
front=back+L*Normalize[D[back,t]];
ParametricPlot[Evaluate@{back,If[frontQ,front,{}]},{t,0,1},PlotRange->{{-5,9},{-4,4}},Axes->False,PlotStyle->Thick,Epilog->{Thick,If[frontQ,Arrow[{back,front}/.t->time],{}],EdgeForm[Black],FaceForm[LightBlue],Table[{Disk[pts[[i]],0.3],Text[Style[i,FontSize->14],pts[[i]]]},{i,1,Length[pts]}]}],{{L,3,"délka kola"},2,6},{{time,0,"čas"},0,1},{{pts,{{-4,0},{-2,-2},{0,0},{2,1},{4,-1}}},Locator,LocatorAutoCreate->True,Appearance->None},{{frontQ,True,"Zobrazit stopu předního kola"},{True,False}}]]

Slider2D

Je-li parametr zadán ve tvaru {p,{(Subscript[x, min]),(Subscript[x, max])},{(Subscript[y, min]),(Subscript[y, max])}} nebo {p,{(Subscript[x, min]),(Subscript[x, max]),(Subscript[krok, 1])},{(Subscript[y, min]),(Subscript[y, max]),(Subscript[krok, 2])}}, použije se ovládací prvek Slider2D.

Manipulate[Graphics[{color,Text[Style["The quick brown fox jumps\n over the lazy dog's back.",FontFamily->family,FontSize->size,FontWeight->weight,FontSlant->slant],offset,{0,0},{Cos[α Degree],Sin[α Degree]}]},PlotRange->{{-1,1},{-1,1}},PlotRangeClipping->True,AxesStyle->Gray,Axes->axes,Background->backcolor],
{{family,"Arial","Písmo"},{"Arial","Times","Courier"}},
{{weight,"Plain","Tloušťka"},{"Plain","Bold"}},
{{slant,"Plain","Sklon"},{"Plain","Italic"}},
{{size,28,"Velikost"},12,32,2,Appearance->"Labeled"},
{{α,30,"Úhel natočení"},0,360},
{{color,Black,"Barva písma"},Black},
{{backcolor,Lighter[Yellow],"Barva pozadí"},Lighter[Yellow]},
{{axes,False,"Zobrazit osy"},{True,False}},
{{offset,{0,0},"Zarovnání"},{-1,-1},{1,1}}]

InputField

Je-li parametr zadán ve tvaru {p,výraz}, kde výraz nemá žádný z dosud popsaných tvarů, použije se ovládací prvek InputField.

Manipulate[Integrate[f, x], {{f,Sin[x]*Cos[x],"Zadejte funkci:"}, Sin[x]*Cos[x]}]

Manipulate[Plot[f,{x,xmin,xmin+width},PlotRange->All], {{f,Sin[x]+Sin[2x]}, Sin[x]*Cos[x]},{{xmin,0},0},{{width,10},10}]

Změna typu ovládacích prvků

V následujícím příkladu Mathematica automaticky vybere PopupMenu:

Manipulate[ImageEffect[,efekt],{efekt,{"Charcoal","OilPainting","Embossing","Solarization","Noise","SaltPepperNoise"}}]

Pomocí volby ControlType můžeme požádat o jiný ovládací prvek:

Manipulate[ImageEffect[,efekt],{efekt,{"Charcoal","OilPainting","Embossing","Solarization","Noise","SaltPepperNoise"},ControlType->SetterBar}]

K dispozici jsou následující ovládací prvky: Animator, CheckBox, ColorSetter, ColorSlider, InputField, Manipulator, PopupMenu, RadioButton, RadioButtonBar, Setter, SetterBar, Slider, Slider2D, Trigger, VerticalSlider.

Manipulate[ImageEffect[,efekt],{efekt,{"Charcoal","OilPainting","Embossing","Solarization","Noise","SaltPepperNoise"},ControlType->RadioButtonBar,Appearance->"Vertical"}]

Oddělovače, anotace, mezery

?Delimiter

Manipulate[ImageEffect[,efekt],{efekt,{"Charcoal","OilPainting","Embossing","Solarization",Delimiter,"Noise","SaltPepperNoise"}}]

?Spacer

Příklad: Lissajousouvy křivky

Manipulate[ParametricPlot[{A Sin[a (x+p)],B Cos[b (x+q)]},{x,0,20 π},PlotRange->1,PerformanceGoal->"Quality",ImageSize->250],Style["Horizontal",FontSize->12,FontWeight->Bold],Spacer[{0,10}],{{a,1,"Frequency"},1,4},{{A,1,"Amplitude"},0,1},{{p,0,"Phase"},0,2 π},Delimiter,Spacer[{0,10}],Style["Vertical",FontSize->12,FontWeight->Bold],Spacer[{0,10}],{{b,(5/4),"Frequency"},1,4},{{B,1,"Amplitude"},0,1},{{q,0,"Phase"},0,2 π}]

Rozmístění ovládacích prvků

ControlPlacement

Manipulate[ImageEffect[,efekt],{efekt,{"Charcoal","OilPainting","Embossing","Solarization","Noise","SaltPepperNoise"},ControlType->RadioButtonBar,Appearance->"Vertical"}]

ControlPlacement nastavuje umístění ovládacích prvků (přípustné hodnoty jsou Top, Bottom, Left, Right):

Manipulate[ImageEffect[,efekt],{{efekt,"Charcoal",""},{"Charcoal","OilPainting","Embossing","Solarization","Noise","SaltPepperNoise"},ControlType->RadioButtonBar,Appearance->"Vertical",ControlPlacement->Left}]

Umístění lze volit u každého ovládacího prvku zvlášť:

Manipulate[ParametricPlot[{A Sin[a (x+p)],B Cos[b (x+q)]},{x,0,20 π},PlotRange->1,PerformanceGoal->"Quality",ImageSize->250],{{a,1,"Frequency 1"},1,4,ControlPlacement->Top},{{A,1,"Amplitude 1"},0,1,ControlPlacement->Top},{{p,0,"Phase 1"},0,2 π,ControlPlacement->Top},{{b,(5/4),"Frequency 2"},1,4,ControlPlacement->Bottom},{{B,1,"Amplitude 2"},0,1,ControlPlacement->Bottom},{{q,0,"Phase 2"},0,2 π,ControlPlacement->Bottom}]

Chceme-li změnit umístění anotace, zadáme ji ve tvaru Item[text,ControlPlacement->pozice]

Manipulate[ParametricPlot[{A Sin[a (x+p)],B Cos[b (x+q)]},{x,0,20 π},PlotRange->1,PerformanceGoal->"Quality",ImageSize->250],Item[Style["Horizontal",FontSize->12,FontWeight->Bold],Alignment->Center],Spacer[{0,10}],{{a,1,"Frequency 1"},1,4,ControlPlacement->Top},{{A,1,"Amplitude 1"},0,1,ControlPlacement->Top},{{p,0,"Phase 1"},0,2 π,ControlPlacement->Top},Item[Spacer[{0,10}],ControlPlacement->Bottom],Item[Style["Vertical",FontSize->12,FontWeight->Bold],ControlPlacement->Bottom,Alignment->Center],Item[Spacer[{0,10}],ControlPlacement->Bottom],{{b,(5/4),"Frequency 2"},1,4,ControlPlacement->Bottom},{{B,1,"Amplitude 2"},0,1,ControlPlacement->Bottom},{{q,0,"Phase 2"},0,2 π,ControlPlacement->Bottom}]

Control

Specifikaci každého parametru lze uzavřít do Control. 
Toto jsou ekvivalentní zápisy:

Manipulate[x,{x,0,1}]

Manipulate[x,Control[{x,0,1}]]

Verze s Control je užitečná v případě, kdy chceme ovládací prvky seskupovat do řádků (Row), sloupců (Column) nebo tabulek (Grid).

Manipulate[x+y,
Row[{Control[{x,1,2}],Spacer[20],Control[{y,1,3}]}]]

Složitější příklad s Grid:

Manipulate[Plot[f,{x,xmin,xmin+width},PlotRange->{ymin,ymin+height},AspectRatio->Automatic,PlotStyle->{AbsoluteThickness[thickness]},Filling->If[fill,Axis,None]], {{f,Sin[x]+Sin[2x],"Zadejte funkci:"}, Sin[x]*Cos[x],ControlPlacement->Top},
Spacer[10],
Grid[{{Control[{{xmin,0,"x-minimum"},0,FieldSize->3}],
Control[{{width,12,"Šířka"},12,FieldSize->3}],
Control[{{fill,False,"Výplň"},{True,False}}]},
{Control[{{ymin,-2,"y-minimum"},-2,FieldSize->3}],
Control[{{height,4,"Výška"},4,FieldSize->3}],
Control[{{thickness,2,"Tloušťka"},1,10,Appearance->"Labeled",ImageSize->Tiny}]}},Alignment->Left,Spacings->{4}],
ControlPlacement->Bottom]

Některé další volby funkce Manipulate

Options[Manipulate]

SaveDefinitions

Manipulate zobrazující hypocykloidu závisí na definicích dvou pomocných funkcí:

f[n_][t_]:=1/n{(n-1)Cos[t]-Cos[(n-1)t],(n-1)Sin[t]+Sin[(n-1)t]};
hypocykloida[n_][tmax_]:=ParametricPlot[f[n][t],{t,0,tmax},PlotRange->{{-1,1},{-1,1}},PlotStyle->Blue,Epilog->{Circle[],Circle[1/n{(n-1)Cos[tmax],(n-1)Sin[tmax]},1/n],Blue,PointSize[Large],Point[f[n][tmax]]}]

Manipulate[hypocykloida[n][tmax],{{n,3,"poměr velikostí"},3,10},{tmax,0.01,100}]

Nejsou-li definice v paměti (např. pokud restartujeme Mathematicu), nebude Manipulate fungovat. Použijeme-li však SaveDefinitions->True, uloží se všechny potřebné definice společně se zdrojovým kódem Manipulate.

Manipulate[hypocykloida[n][tmax],{{n,3,"poměr velikostí"},3,10},{tmax,0.01,100},SaveDefinitions->True]

AppearanceElements, Paneled

?AppearanceElements

Manipulate[ParametricPlot[Interpolation[Transpose[{Range[0,1,1/(Length[pts]-1)],pts}], Method->"Spline"][t],{t,0,1},PlotRange->{{-5,5},{-5,5}},Epilog->{EdgeForm[Black],FaceForm[LightBlue],Table[{Disk[pts[[i]],0.2],Text[i,pts[[i]]]},{i,1,Length[pts]}]}],{{pts,{{-4,-1},{-2,1},{0,-1},{2,1},{4,-2}}},Locator,LocatorAutoCreate->True,Appearance->None},AppearanceElements->All]

Manipulate[ParametricPlot[Interpolation[Transpose[{Range[0,1,1/(Length[pts]-1)],pts}], Method->"Spline"][t],{t,0,1},PlotRange->{{-5,5},{-5,5}},Epilog->{EdgeForm[Black],FaceForm[LightBlue],Table[{Disk[pts[[i]],0.2],Text[i,pts[[i]]]},{i,1,Length[pts]}]}],{{pts,{{-4,-1},{-2,1},{0,-1},{2,1},{4,-2}}},Locator,LocatorAutoCreate->True,Appearance->None},AppearanceElements->None]

?Paneled

Manipulate[ParametricPlot[Interpolation[Transpose[{Range[0,1,1/(Length[pts]-1)],pts}], Method->"Spline"][t],{t,0,1},PlotRange->{{-5,5},{-5,5}},Epilog->{EdgeForm[Black],FaceForm[LightBlue],Table[{Disk[pts[[i]],0.2],Text[i,pts[[i]]]},{i,1,Length[pts]}]}],{{pts,{{-4,-1},{-2,1},{0,-1},{2,1},{4,-2}}},Locator,LocatorAutoCreate->True,Appearance->None},Paneled->False,AppearanceElements->None]

Bookmarks

Pomocí volby Bookmarks se dají nastavit záložky s předdefinovanými hodnotami:

Manipulate[hypocykloida[n][tmax],{{n,3,"poměr velikostí"},3,10,Appearance->"Labeled"},{tmax,0.01,100},Bookmarks->{"deltoida":>(n=3),"asteroida":>(n=4)}]

Jiné řešení: Jeden parametr může mít definováno více ovládacích prvků.

Manipulate[hypocykloida[n][tmax],{{n,3,"poměr velikostí"},3,10,Appearance->"Labeled"},{tmax,0.01,100},{{n,3,"speciální případy"},{3->"deltoida",4->"asteroida"}}]

Optimalizace Manipulate

?ControlActive

g=Graphics[Text[Style["Přepočítávám...",Red,FontSize->25,FontWeight->Bold,FontFamily->"Arial"]]]

Manipulate[ControlActive[g,ImageEffect[,{"OilPainting",o}]],{o,1,10,1}]

Mandelbrotova množina (viz lekci Urychlování výpočtů) s přepínáním rozlišení:

iCountCompiled=Compile[{{c,_Complex}},Module[{cnt = 0,z=0.0I},While[Abs[z] < 100 && cnt < 100, cnt++; z = z^2 + c]; cnt]];
mandelbrotCompiled[{{xmin_, xmax_}, {ymin_, ymax_}}, {xres_, yres_}] :=
    Table[iCountCompiled[x + I*y], {y, ymin, ymax, (ymax - ymin)/xres}, {x, xmin, xmax, (xmax - xmin)/yres}];
showMatrix[matrix_] := ArrayPlot[matrix, Mesh -> False, Frame -> False, 
   ColorFunction -> (If[#1 == 1, Hue[1, 1, 0], Hue[(5*#1)/6]] & )];
{(Subscript[x, 0]),(Subscript[y, 0])}={-1.408,0.136};
Manipulate[showMatrix[res=ControlActive[50,200];mandelbrotCompiled[{{(Subscript[x, 0])-0.8^n,(Subscript[x, 0])+0.8^n},{(Subscript[y, 0])-0.8^n,(Subscript[y, 0])+0.8^n}},{res,res}]],{n,-3,32}]

U funkcí jako Plot, Plot3D, ContourPlot, ParametricPlot apod. přepíná Mathematica rozlišení automaticky:

Manipulate[Plot3D[Sin[a x]Sin[b y],{x,0,3},{y,0,3},PlotRange->1],{a,2,3},{b,1,3}]

Jak je to zařízeno? Tyto funkce akceptují volbu PerformanceGoal s hodnotami "Speed" nebo "Quality".

Plot3D[Sin[3 x]Sin[2 y],{x,0,3},{y,0,3},PerformanceGoal->"Speed"]

Plot3D[Sin[3 x]Sin[2 y],{x,0,3},{y,0,3},PerformanceGoal->"Quality"]

Výchozí nastavení pro PerformanceGoal je ControlActive["Speed","Quality"].

Manipulate[Plot3D[Sin[a x]Sin[b y],{x,0,3},{y,0,3},PerformanceGoal->ControlActive["Speed","Quality"],PlotRange->1],{a,2,3},{b,1,3}]

Máme-li rychlý počítač, můžeme trvale zapnout vyšší kvalitu:

Manipulate[Plot3D[Sin[a x]Sin[b y],{x,0,3},{y,0,3},PerformanceGoal->"Quality",PlotRange->1],{a,2,3},{b,1,3}]

Tlačítka

?Button

Button["Click Here",Print[RandomInteger[100]]]

Příklad 1 (polyorama)

fig={,,,,};

Manipulate[ImageAssemble[{s}],{{s,fig,""},Button["Permutace",s=RandomSample[fig]]&}]

Příklad 2 (interaktivní grafy funkcí)

Manipulate[Plot[f,{x,xmin,xmin+width},PlotRange->{ymin,ymin+height},AspectRatio->Automatic,PlotStyle->{AbsoluteThickness[thickness]},Filling->If[fill,Axis,None]], {{f,Sin[x]+Sin[2x],"Zadejte funkci:"}, Sin[x]*Cos[x],ControlPlacement->Top},
Spacer[10],
Item[Grid[{{Control[{{xmin,0,"x-minimum"},0,FieldSize->3}],
Control[{{width,12,"Šířka"},12,FieldSize->3}],
Control[{{fill,False,"Výplň"},{True,False}}]},
{Control[{{ymin,-2,"y-minimum"},-2,FieldSize->3}],
Control[{{height,4,"Výška"},4,FieldSize->3}],
Control[{{thickness,2,"Tloušťka"},1,10,Appearance->"Labeled",ImageSize->Tiny}]}},Alignment->Left,Spacings->{4}],
ControlPlacement->Bottom],
Item[Spacer[{0,10}],ControlPlacement->Left],Item[Grid[{{"",Button["↑",ymin+=height/4.],""},{Button["←",xmin-=width/4.],"",Button["→",xmin+=width/4.]},{"",Button["↓",ymin-=height/4.],""}},Spacings->{0,0}],ControlPlacement->Left,Alignment->{Center,Center}],Item[Spacer[{0,10}],ControlPlacement->Left],Item[Row[{Button["přiblížit",xmin+=width(1-s)/2.;ymin+=height(1-s)/2.;width*=s;height*=s,ImageSize->All]/.s->N[1/2],Spacer[10],Button["vzdálit",xmin+=width(1-s)/2.;ymin+=height(1-s)/2.;width*=s;height*=s,ImageSize->All]/.s->N[2]}],ControlPlacement->Left,Alignment->Center]]

Funkce Dynamic

Implementace Manipulate je založena na použití funkce Dynamic.

Dynamic[výraz] vrací hodnotu zadaného výrazu. Navíc sleduje všechny proměnné, na nichž hodnota výrazu závisí, a při jejich změně automaticky přepočítává výsledek.

w=3;
Dynamic[w^2]

w=2

f[x_]:=Sin[x];
Dynamic[Plot[f[x],{x,0,2Pi}]]

f[x_]:=Log[x]

?Slider

Slider[Dynamic[z]]

Dynamic[z]

{Slider[Dynamic[k],{1,4},Appearance->"Labeled"],Dynamic[Plot[Sin[k x],{x,0,2Pi}]]}

Podrobnější dokumentace:

Introduction to Dynamic

Advanced Dynamic Functionality

DateString[]

ClockGauge[DateString[]]

?Clock

Dynamic[Clock[];{DateString[],ClockGauge[DateString[]]}]

Cvičení

Jsou-li dány dva různé body (Subscript[A, 1]), (Subscript[A, 2]) v rovině a číslo a>0, pak Cassiniho ovál je množina všech bodů X v rovině, pro které platí |X(Subscript[A, 1])|·|X(Subscript[A, 2])|=a. 
Uvažujme obecnější situaci, kdy je dán konečný počet bodů (Subscript[A, 1]), (Subscript[A, 2]), ... v rovině a hledáme všechny body X v rovině, pro které je součin vzdáleností bodu X od bodů (Subscript[A, i]) roven a. Množina všech takových bodů X tvoří zobecněný Cassiniho ovál.
Vytvořte pomocí Manipulate interaktivní demonstraci pro vykreslování zobecněných Cassiniho oválů. Uživatel bude moci měnit hodnotu parametru a, pohybovat body (Subscript[A, 1]), (Subscript[A, 2]), ... a měnit jejich počet (použijte lokátory). 
Dále bude možné měnit barvu vykreslované křivky (použijte ColorSlider) a kvalitu obrázku (PlotPoints).
Přidejte do demonstrace dvě tlačítka (Button), která po stisknutí přemístí body (Subscript[A, 1]), (Subscript[A, 2]), ... do vrcholů pravidelného mnohoúhelníku, resp. rozmístí je náhodně v zobrazované oblasti roviny (v obou případech musí zůstat zachován počet bodů, který nastavil uživatel).
Tip: K vykreslení zobecněných Cassiniho oválů použijte ContourPlot. Vykreslování obrázků lze urychlit, pokud místo vzdáleností bodů budete počítat s jejich druhými mocninami (SquaredEuclideanDistance).