Matematické kyvadlo

Následující aplet umožňuje názorně pochopit síly, které působí na matematické kyvadlo během jeho pohybu. V apletu jsou zobrazeny všechny mechanické síly - síly odporové a třecí, které pohyb kyvadla brzdí, zobrazeny nejsou!
Ačkoliv se za matematické kyvadlo považuje kyvadlo s rozkyvem do cca 5° na každou stranu, je v apletu nastaven rozkyv 30° kvůli názornosti. Tento maximální rozkyv lze změnit v proměnné fimax.
Při práci s apletem je třeba si uvědomit, že aplet zobrazuje rozklad sil a jejich velikosti BĚHEM POHYBU KYVADLA. Pohyb kyvadla lze simulovat posuvníkem označeným φ, který mění aktuální úhel vychýlení kyvadla od -30° do 30° (tuto hodnotu lze změnit - viz proměnná fimax). Pokud se pohyb posuvníku (a tedy i pohyb kyvadla na obrazovce) zastaví, zůstane zobrazen rozklad sil odpovídající pohybu kyvadla v dané poloze. To částečně napovídá i volitelně zobrazitelný průběh velikosti rychlosti pohybu kyvadla. Aplet počítá velikosti sil a jejich směry na základě aktuální výchylky a na základě ní počítá i velikost rychlosti pohybu.
ZOBRAZIT ROZKLAD SIL PŮSOBÍCÍCH NA KYVADLO, KTERÉ JE V KLIDU, NENÍ MOŽNÉ! (Vyjímkou jsou amplitudy pohybu kyvadla - v nich je kyvadlo v klidu.)

Tlačítkem Ulož obrázek 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="kyvadlo_matematicke_.jpg";
cesta=NotebookDirectory[];
pocetulozeni=0;

x1=-6;x2=-x1;
y1=-6.5;y2=-y1;
stredx=((x1+x2)/2);stredy=((y1+y2)/2);
deltay=0.6;

fimax=30;deltafi=1;
delkamin=0.5;delkamax=10;deltadelka=0.1;
mmin=0.1;mmax=10;deltam=0.1;
polomerkulicky=0.015(x2-x1);

<<PhysicalConstants`;
g=AccelerationDueToGravity/.{Meter->1,Second->1};
gnove=(g/10);

tloustka=0.005;
velikostpisma=17;
polomeruhlu=3delkamin;

barva=Black;
barvastrop=Gray;
barvakyvadlo=Lighter[Gray,0.4];
barvakulicka1=Lighter[Red,0.6];
barvakulicka2=Darker[Red,0.6];
barvafi=Orange;
barvafg=Red;
barvaftecna=Blue;
barvafn=RGBColor[0.05,0.55,0];
barvaftahova=Magenta;
barvafnormalova=Black;
barvafvysledna=Orange;

strop=Rectangle[{0.75x1,0.93y2},{0.75x2,y2}];
svislice=Line[{{stredx,0.93y2},{stredx,0.5y2}}];

vyskamax=((l-hmax)/l)==Cos[finula];
reseni=Solve[vyskamax,hmax];
h0=hmax/.reseni[[1]];
vyska=((l-haktualni)/l)==Cos[fiaktualni];
reseni=Solve[vyska,haktualni];
h1=haktualni/.reseni[[1]];
h=h0-h1;
zze=0.5hmotnost (v^2)==hmotnost zrychlenig h;
reseni=Solve[zze,v];
rychlostobecne=v/.reseni[[2]];
vmax=rychlostobecne/.{fiaktualni->0,finula->fimax Degree,l->delkamax,hmotnost->mmax,zrychlenig->gnove};

MatematickeKyvadlo=Manipulate[Deploy[
prubehrychlosti[fiaktualni_]=rychlostobecne/.{finula->fimax Degree,l->delka,hmotnost->m,zrychlenig->gnove};
rychlost=rychlostobecne/.{fiaktualni->fi Degree,finula->fimax Degree,l->delka,hmotnost->m,zrychlenig->gnove};
bodgrafu=Point[{fi Degree,prubehrychlosti[fiaktualni]/.fiaktualni->fi Degree}];

perioda=2π(Sqrt[(delka/g)]);
Ft=m gnove Sin[fi Degree];
Fn=m gnove Cos[fi Degree];
Fnormalova=((m (rychlost^2))/delka);
Ftahova=Fnormalova+Fn;
Fvysledna=(Sqrt[(Fnormalova^2)+(Ft^2)]);
If[Quiet[NumericQ[(Fnormalova/Ft)]],
{uhelsily=Tan[alfapom Degree]==(Fnormalova/Ft),
reseni=Quiet[Solve[uhelsily,alfapom]],
alfa=alfapom/.reseni[[1]],
If[fi>0,
alfa=alfa+180,
""]},
alfa=270];

kulickax=stredx+delka Cos[(270+fi) Degree];
kulickay=0.93y2+delka Sin[(270+fi) Degree];
If[fi<0,
{uhel1=(270+fi)Degree,
uhel2=270Degree},
{uhel1=270Degree,
uhel2=(270+fi)Degree}];
uhel=Circle[{stredx,0.93y2},polomeruhlu,{uhel1,uhel2}];
kyvadlozavespomocne=Line[{{stredx,0.93y2},{stredx+0.25delkamax Cos[(270+fi) Degree],0.93y2+0.25delkamax Sin[(270+fi) Degree]}}];
kyvadlozaves=Line[{{stredx,0.93y2},{kulickax,kulickay}}];
kyvadlokulicka1=Disk[{kulickax,kulickay},polomerkulicky];
kyvadlokulicka2=Circle[{kulickax,kulickay},polomerkulicky];
silatihova={
Arrowheads[{0,7tloustka}],
Arrow[{{kulickax,kulickay},{kulickax,kulickay-m gnove}}]};
silaFt={
Arrowheads[{0,7tloustka}],Arrow[{{kulickax,kulickay},{kulickax-Ft Cos[(360-fi)Degree],kulickay+Ft Sin[(360-fi)Degree]}}]};
silaFn={
Arrowheads[{0,7tloustka}],
Arrow[{{kulickax,kulickay},{kulickax+Fn Cos[(270+fi)Degree],kulickay+Fn Sin[(270+fi)Degree]}}]};
silaFtahova={
Arrowheads[{0,7tloustka}],
Arrow[{{kulickax,kulickay},{kulickax+Ftahova Cos[(90+fi)Degree],kulickay+Ftahova Sin[(90+fi)Degree]}}]};
silaFnormalova={
Arrowheads[{0,7tloustka}],
Arrow[{{kulickax,kulickay},{kulickax+Fnormalova Cos[(90+fi)Degree],kulickay+Fnormalova Sin[(90+fi)Degree]}}]};
silaFvysledna={
Arrowheads[{0,7tloustka}],Arrow[{{kulickax,kulickay},{kulickax+Fvysledna Cos[(360+alfa-fi) Degree],kulickay-Fvysledna Sin[(360+alfa-fi) Degree]}}]};
spojniceFvysledna1=Line[{{kulickax+Fnormalova Cos[(90+fi)Degree],kulickay+Fnormalova Sin[(90+fi)Degree]},{kulickax+Fvysledna Cos[(360+alfa-fi) Degree],kulickay-Fvysledna Sin[(360+alfa-fi) Degree]}}];
spojniceFvysledna2=Line[{{kulickax-Ft Cos[(360-fi)Degree],kulickay+Ft Sin[(360-fi)Degree]},{kulickax+Fvysledna Cos[(360+alfa-fi) Degree],kulickay-Fvysledna Sin[(360+alfa-fi) Degree]}}];
spojniceFvysledna3=Line[{{kulickax,kulickay-m gnove},{kulickax+Fvysledna Cos[(360+alfa-fi) Degree],kulickay-Fvysledna Sin[(360+alfa-fi) Degree]}}];
spojniceFvysledna4=Line[{{kulickax+Ftahova Cos[(90+fi)Degree],kulickay+Ftahova Sin[(90+fi)Degree]},{kulickax+Fvysledna Cos[(360+alfa-fi) Degree],kulickay-Fvysledna Sin[(360+alfa-fi) Degree]}}];
spojniceFvysledna5=Line[{{kulickax-Ft Cos[(360-fi)Degree],kulickay+Ft Sin[(360-fi)Degree]},{kulickax,kulickay-m gnove}}];
spojniceFvysledna6=Line[{{kulickax+Fn Cos[(270+fi)Degree],kulickay+Fn Sin[(270+fi)Degree]},{kulickax,kulickay-m gnove}}];

grafik=Show[
Graphics[{
{barvastrop,strop},
If[zobrazituhel,
{{barva,Dashed,Thickness[0.3tloustka],svislice},
{barva,Dashed,Thickness[0.3tloustka],kyvadlozavespomocne},(*Je zde kvůli vykreslení úhlu - aby "nezmizelo" rameno při krátkémzávěsu kyvadla*)
{barva,Dotted,Thickness[0.3tloustka],uhel},
Text[Style["φ",15,barva,FontFamily->Times],{stredx+0.7polomeruhlu Cos[(270+0.5fi) Degree],0.93y2+0.7polomeruhlu Sin[(270+0.5fi) Degree]},{Center,Center}]},
Text[""]],
{barvakyvadlo,Thickness[tloustka],kyvadlozaves},
{barvakulicka1,kyvadlokulicka1},
{barvakulicka2,Thickness[0.7tloustka],kyvadlokulicka2},
If[zobrazitsily,
{If[zobrazitspojnice=="(Overscript[F, ⟶])1",
{{barvaftecna,Dotted,Thickness[0.3tloustka],spojniceFvysledna1},
{barvafnormalova,Dotted,Thickness[0.3tloustka],spojniceFvysledna2}},
If[zobrazitspojnice=="(Overscript[F, ⟶])2",
{{barvaftahova,Dotted,Thickness[0.3tloustka],spojniceFvysledna3},
{barvafg,Dotted,Thickness[0.3tloustka],spojniceFvysledna4}},
If[zobrazitspojnice=="(Overscript[(Subscript[F, G]), ⟶])",
{{barvafn,Dotted,Thickness[0.3tloustka],spojniceFvysledna5},
{barvaftecna,Dotted,Thickness[0.3tloustka],spojniceFvysledna6}},
Text[""]]]],
{barvafg,Thickness[tloustka],silatihova},
{barvaftecna,Thickness[tloustka],silaFt},
{barvafn,Thickness[tloustka],silaFn},
{barvaftahova,Thickness[tloustka],silaFtahova},
{barvafnormalova,Thickness[tloustka],silaFnormalova},
{barvafvysledna,Thickness[tloustka],silaFvysledna}},
Text[""]],
Text[Style[StringJoin["φ = ",ToString[fi]," °"],20,barva,FontFamily->Times],{x1,y1+deltay},{Left,Bottom}],
Text[Style[StringJoin["l = ",ToString[delka]," m"],20,barva,FontFamily->Times],{stredx,y1+deltay},{Center,Bottom}],
Text[Style[StringJoin["m = ",ToString[m]," kg"],20,barva,FontFamily->Times],{x2,y1+deltay},{Right,Bottom}],
If[zobrazitperiodu,
Text[Style[StringJoin["T = ",ToString[Round[perioda,0.01]]," s"],20,barva,FontFamily->Times],{x1,y1},{Left,Bottom}],
Text[""]]
}],
FormatType->StandardForm,AspectRatio->Automatic,PlotRange->{{x1,x2},{y1,y2}},ImageSize->480
]],

{{fi,-fimax,Style["φ",20,barva,Italic]},-fimax,fimax,deltafi},
{{delka,2.5,Style["l",20,barva,Italic]},delkamin,delkamax,deltadelka},
{{m,2,Style["m",20,barva,Italic]},mmin,mmax,deltam},
Delimiter,
Item[Style[StringJoin["Zobrazit:"],15,barva,FontFamily->Times],Alignment->Left],
{{zobrazituhel,False,Style["úhel",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitsily,True,Style["síly",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitspojnice,"žádný",Style["rovnoběžník sil",15,barva,FontFamily->Times]},{"žádný","(Overscript[F, ⟶])1","(Overscript[F, ⟶])2","(Overscript[(Subscript[F, G]), ⟶])"},ControlType->RadioButton},
{{zobrazitperiodu,False,Style["periodu",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitrychlost,True,Style["průběh rychlosti",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,

Dynamic[Grid[{
{If[zobrazitrychlost,
Show[Plot[prubehrychlosti[fiaktualni],{fiaktualni,-fimax Degree,fimax Degree},PlotStyle->{Thickness[2tloustka],barva},PlotRange->{{-1.1fimax Degree,1.1fimax Degree},{0,1.05vmax}},AspectRatio->Automatic,AxesOrigin->{0,0},AxesLabel->{"φ","(v/(m . (s^(-1))))"},Ticks->{{-fimax Degree,0,fimax Degree},Automatic}],
Graphics[{{barvafi,PointSize[0.09],bodgrafu}}],
ImageSize->100],
""]},
{If[zobrazitsily,
Item[Style[StringJoin["(Overscript[(Subscript[F, G]), ⟶]) - tíhová síla; (Subscript[F, G]) = ",ToString[Round[m g,0.01]]," N"],velikostpisma,barvafg,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitsily,
Item[Style[StringJoin["(Overscript[(Subscript[F, tah]), ⟶]) - tahová síla; (Subscript[F, tah]) = ",ToString[Round[Ftahova (g/gnove),0.01]]," N"],velikostpisma,barvaftahova,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitsily,
Item[Style[StringJoin["(Overscript[(Subscript[F, t]), ⟶]) - tečná složka (Overscript[(Subscript[F, G]), ⟶]); (Subscript[F, t]) = ",ToString[Round[Abs[Ft(g/gnove)],0.01]]," N"],velikostpisma,barvaftecna,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitsily,
Item[Style[StringJoin["(Overscript[(Subscript[F, Gn]), ⟶]) - normálová složka (Overscript[(Subscript[F, G]), ⟶]); (Subscript[F, Gn]) = ",ToString[Round[Fn(g/gnove),0.01]]," N"],velikostpisma,barvafn,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitsily,
Item[Style[StringJoin["(Overscript[(Subscript[F, n]), ⟶]) - normálová síla; (Subscript[F, n]) = ",ToString[Round[Fnormalova(g/gnove),0.01]]," N"],velikostpisma,barvafnormalova,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitsily,
Item[Style[StringJoin["(Overscript[F, ⟶]) - síla výsledná; F = ",ToString[Round[Fvysledna(g/gnove),0.01]]," N"],velikostpisma,barvafvysledna,FontFamily->Times],Alignment->Left],
""]}}]],
Delimiter,
Button[" Ulož obrázek ",{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["Matematické kyvadlo",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.

MatematickeKyvadlo