Harmonické kmitání - pružina

Následující aplet umožňuje názorně pochopit základní charakteristiky kmitavého pohybu (amplituda, frekvence, počáteční fáze). Pro lepší názornost je zobrazena též pružina, na které kmitá závaží. Příslušnou volbou lze zvolit zobrazení okamžité polohy tělesa kmitajícího na pružině i v grafu závislosti okamžité výchylky na čase.
Pomocí posuvníků lze nastavit (v daném intervalu) amplitudu kmitavého pohybu, frekvenci a počáteční fázi. Posuvníkem t lze na grafu zobrazovat okamžité výchylky v libovolném čase z intervalu, na kterém je graf zobrazen. Současně s tím se mění okamžitá výchylka tělesa kmitajícího na pružině.
Hodnoty nastavené pomocí posuvníků m a k se projeví pouze tehdy, pokud je zaškrtnuto zobrazení sil. Je-li zaškrtnuta volba zobrazení sil, NELZE měnit posuvníkem frekvenci. Frekvence kmitavého pohybu se v tomto případě dopočítává na základě tuhosti pružiny k a hmotnosti m tělesa na pružině zavěšného.
Hodnoty vypisované vedle všech posuvníků jsou vypisovány v základních jednotkách příslušné veličiny.

Pomocí zaškrtávacích tlačítek lze volit zobrazení:
	periody - zobrazí se její číselná hodnota i poloha v grafu;
	rovnice okamžité výchylky - rovnice se zobrazí s dosazenými číselnými údaji;
	okamžité výchylky v čase t nastaveném posuvníkem;
	pružiny s tělesem na ní zavěšeným;
	sil, které působí na těleso zavěšené na pružině; velikosti sil se přitom vypíší na obrazovku.

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

ClearAll["Global`*"];
jmenosouboru="kmitani_zaklad_pruzina_.jpg";
cesta=NotebookDirectory[];
pocetulozeni=0;

x1=-10;x2=-x1;
y1=-5;y2=-y1;
delkaosyx=0.5(x2-x1);delkaosyy=0.8(y2-y1);
stredx=((x1+x2)/2);stredy=((y1+y2)/2)-0.5(y2-y1-delkaosyy);
prodlouzeniy=2;(*Pro určení výšky aktivního okna.*)
polomer=0.02(x2-x1);
maxpocetzavitu=10;
koeficient=0.4;(*Zmenšuje velikost VYKRESLOVANÝCH sil.*)

ym0=1;ymmin=0.5;ymmax=5;deltaym=0.1;
fi0=0;fimin=0;fimax=π;deltafi=(π/10);
t0=0;tmin=0;tmax=x2;deltat=0.1;
mmin=0.5;m0=mmin;mmax=2;deltam=0.1;
kmin=0.5;k0=mmin;kmax=2;deltak=0.1;
f0=0.1;fmin=fmin=Round[(1/(2π))(Sqrt[(kmin/mmax)]),0.01];fmax=2;deltaf=0.1;
fstara=f0;

tloustka=0.005;
velikostbodu=0.02;

barva=Black;
barvay=Darker[Green,0.6];
barvaf=Orange;
barvafi=Magenta;
barvagrafu=Darker[Blue];
barvaperioda=Orange;
barvadrzak=Gray;
barvazavazi=Darker[Green];
barvapruzina=Black;
barvaokamzitapoloha=barvazavazi;
barvaspojnice=Black;
barvaFg=Brown;
barvaFp=Lighter[Blue,0.4];
barvaF=Red;
barvavarovani=Red;

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

osax=Line[{{stredx-0.1delkaosyx,stredy},{stredx+delkaosyx,stredy}}];
osay=Line[{{stredx,stredy-0.5delkaosyy},{stredx,stredy+0.5delkaosyy}}];
drzakpruziny=Line[{{x1,y2},{0.2x1,y2}}];
drzakpruziny1=Line[{{0.6x1,y2},{0.6x1,0.9y2}}];
zavazix=0.6x1;

KmitaniPruzina=Manipulate[

If[zobrazitsily∧zobrazitpruzinu,
f=Round[(1/(2π))(Sqrt[(k/m)]),0.01],
""];
okamzitavychylka[t_]:=ym Sin[2π f t+fi];
ymgraf[t_]:=(delkaosyy/(2ymmax))ym Sin[2π f t+fi-stredx]+stredy;
rovnice=StringJoin[ToString[Style["Rovnice kmitavého pohybu: ",barva],StandardForm],ToString[Style["y",barvaokamzitapoloha],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[ym],barvay],StandardForm],ToString[Style[" sin (2π.",barva],StandardForm],ToString[Style[ToString[f],barvaf],StandardForm],ToString[Style[".t + ",barva],StandardForm],ToString[Style[ToString[fi,StandardForm],barvafi],StandardForm],ToString[Style[")",barva],StandardForm]];
yokamzita=StringJoin[ToString[Style["Okamžitá výchylka v čase ",barva],StandardForm],ToString[Style[ToString[aktualnit],barva],StandardForm],ToString[Style[" s je ",barva],StandardForm],ToString[Style["y",barvaokamzitapoloha],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[okamzitavychylka[aktualnit],0.01]],barvaokamzitapoloha],StandardForm],ToString[Style[" m",barva],StandardForm]];
zavaziy=ymgraf[aktualnit];
zavazi=Disk[{zavazix,zavaziy},polomer];
okamzitapoloha=Point[{aktualnit,ymgraf[aktualnit]}];
spojnice=Line[{{0.6x1,ymgraf[aktualnit]},{aktualnit,ymgraf[aktualnit]}}];
Fg=koeficient m g;
Fvysledna=koeficient k okamzitavychylka[aktualnit];
Fp=Fg-Fvysledna;
If[m g-k ym<0,
chyba=True,
chyba=False];
silatihova={
Arrowheads[{0,7tloustka}],
Arrow[{{zavazix,zavaziy},{zavazix,zavaziy-Fg}}]};
silavysledna={
Arrowheads[{0,7tloustka}],
Arrow[{{zavazix,zavaziy},{zavazix,zavaziy-Fvysledna}}]};
silapruznosti={
Arrowheads[{0,7tloustka}],
Arrow[{{zavazix,zavaziy},{zavazix,zavaziy+Fp}}]};
pocetzavitu=Round[(k/kmax)maxpocetzavitu];
pruzina={Table[Line[{{zavazix,0.9y2-((2(i-1))/(2pocetzavitu))(0.9y2-1.8polomer-ymgraf[aktualnit])},{(0.8-0.1Mod[2i-1,4])x1,0.9y2-(((2i-1))/(2pocetzavitu))(0.9y2-1.8polomer-ymgraf[aktualnit])},{zavazix,0.9y2-((2i)/(2pocetzavitu))(0.9y2-1.8polomer-ymgraf[aktualnit])}}],{i,1,pocetzavitu,1}],
Line[{{0.6x1,1.8polomer+ymgraf[aktualnit]},{0.6x1,ymgraf[aktualnit]}}]};
perioda=Point[{(1/f)+stredx,stredy}];
periodaline=Line[{{(1/f)+stredx,stredy},{(1/f)+stredx,ymgraf[(1/f)+stredx]}}];

Show[
Plot[ymgraf[t],{t,tmin,tmax},PlotStyle->{barvagrafu,Thickness[0.7tloustka]},Axes->False],
Graphics[{
{barva,Thickness[0.5tloustka],osax},
{barva,Thickness[0.5tloustka],osay},
Text[Style["(t/s)",12,barva,FontFamily->Times],{stredx+delkaosyx,stredy+0.04y1},{Right,Top}],
Text[Style["(y/m)",12,barva,FontFamily->Times],{stredx+0.03x2,stredy+0.5delkaosyy},{Left,Top}],
If[zobrazitpruzinu,
{{barvadrzak,Thickness[2tloustka],drzakpruziny},
{barvapruzina,Thickness[tloustka],drzakpruziny1},
{barvapruzina,Thickness[((1.1k)/kmax)tloustka],pruzina},
If[zobrazitokamzitey,
{{barvaspojnice,Dotted,Thickness[0.3tloustka],spojnice},
{barvazavazi,zavazi},
{barvaokamzitapoloha,PointSize[0.9velikostbodu],okamzitapoloha},
Text[Style[yokamzita,15,barva,FontFamily->Times],{0.3x1,1.4y1},{Left,Center}]},
{barvazavazi,zavazi}],
If[zobrazitsily&&chyba==False,
{{barvaFg,Thickness[tloustka],silatihova},
Text[Style["(Overscript[(Subscript[F, G]), →])",15,barvaFg,FontFamily->Times,Bold],{1.2zavazix,zavaziy-Fg},{Right,Bottom}],
{barvaFp,Thickness[tloustka],silapruznosti},
Text[Style["(Overscript[(Subscript[F, p]), →])",15,barvaFp,FontFamily->Times,Bold],{1.2zavazix,zavaziy+Fp},{Right,Top}],
Text[Style[StringJoin[ToString[Style["(Subscript[F, G])",barvaFg],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[(Fg/koeficient),0.01]],barvaFg],StandardForm],ToString[Style[" N",barva],StandardForm]],15,barva,FontFamily->Times],{x1,1.8y1},{Left,Center}],
Text[Style[StringJoin[ToString[Style["(Subscript[F, p])",barvaFp],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[(Fp/koeficient),0.01]],barvaFp],StandardForm],ToString[Style[" N",barva],StandardForm]],15,barva,FontFamily->Times],{stredx,1.8y1},{Center,Center}],
If[Fvysledna≠0,
{{barvaF,Thickness[tloustka],silavysledna},
Text[Style["(Overscript[F, →])",15,barvaF,FontFamily->Times,Bold],{0.8zavazix,zavaziy-Fvysledna},{Right,Center}],
Text[Style[StringJoin[ToString[Style["F",barvaF],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[Abs[(Fvysledna/koeficient)],0.01]],barvaF],StandardForm],ToString[Style[" N",barva],StandardForm]],15,barva,FontFamily->Times],{x2,1.8y1},{Right,Center}]},
Text[""]]},
If[chyba==True,
Text[Style["Kombinace (Subscript[y, m]), m a k NEODPOVÍDÁ REÁLNÉ SITUACI!",20,barvavarovani,FontFamily->Times,Bold],{stredx,prodlouzeniy y1},{Center,Bottom}],
Text[""]]]},
Text[""]],
If[zobrazitokamzitey&&zobrazitpruzinu==False,
{{barvaokamzitapoloha,PointSize[0.9velikostbodu],okamzitapoloha},
Text[Style[yokamzita,15,barva,FontFamily->Times],{0.3x1,1.4y1},{Left,Center}]},
Text[""]],
If[zobrazitrovnici,
Text[Style[rovnice,15,barva,FontFamily->Times],{0.3x1,1.2y1},{Left,Center}],
Text[""]],
If[zobrazitperiodu,
{{barvaperioda,PointSize[0.9velikostbodu],perioda},
{barvaperioda,Dashed,Thickness[0.3tloustka],periodaline},
Text[Style[StringJoin[ToString[Style["T",barvaperioda],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[Round[(1/f),0.01]],barvaperioda],StandardForm],ToString[Style[" s",barva],StandardForm]],15,barva,FontFamily->Times],{0.3x1,1.6y1},{Left,Center}]},
Text[""]]
}],
FormatType->StandardForm,AspectRatio->Automatic,PlotRange->{{x1,x2},{prodlouzeniy y1,y2}},ImageSize->510],

{{ym,ym0,Style["(Subscript[y, m])",15,barvay]},ymmin,ymmax,deltaym,Appearance->"Labeled"},
{{f,f0,Style["f",15,barvaf]},fmin,fmax,deltaf,Appearance->"Labeled"},
{{fi,fi0,Style["(Subscript[φ, 0])",15,barvafi]},fimin,fimax,deltafi,Appearance->"Labeled"},
Delimiter,
{{aktualnit,t0,Style["t",15,barva]},tmin,tmax,deltat,Appearance->"Labeled"},
Delimiter,
{{m,m0,Style["m",15,barva]},mmin,mmax,deltam,Appearance->"Labeled"},
{{k,k0,Style["k",15,barva]},kmin,kmax,deltak,Appearance->"Labeled"},
Delimiter,
Item[Style["Zobrazit",15,barva,FontFamily->Times,Bold]],
{{zobrazitperiodu,False,Style["periodu",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitrovnici,True,Style["rovnici",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitokamzitey,True,Style["výchylku v t",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitpruzinu,True,Style["pružinu",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitsily,False,Style["síly",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
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["Harmonické kmitání - pružina",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.

KmitaniPruzina