Lissajousovy obrazce

Následující aplet umožňuje názorně simulovat Lissajousovy obrazce, které vznikají při skládání dvou na sebe kolmých kmitů. Pomocí posuvníků lze měnit parametry obou dílčích kmitání:
	- amplitudu;
	- frekvenci;
	- počáteční fázi.
Hodnoty vypisované vedle příslušných posuvníků jsou udány v základních jednotkách dané veličiny.
Frekvence je zobrazena záměrně ve tvaru zlomku, aby bylo možné snáze určovat poměry frekvencí obou kmitavých pohybů.

Volitelně lze zobrazit grafy dílčích kmitavých pohybů, body v grafu a rovnice popisující dané kmitavé pohyby.
Posuvník t funguje POUZE TEHDY, je-li vybrána položka body v grafu.

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="lissajous_.jpg";
cesta=NotebookDirectory[];
pocetulozeni=0;

amplitudax0=1;amplitudaxmin=0.1;amplitudaxmax=1;deltaamplitudax=0.1;
amplituday0=1;amplitudaymin=0.1;amplitudaymax=1;deltaamplituday=0.1;
mezeramezigrafy=0.5amplitudaxmax;
x1=-1.1(3amplitudaxmax+mezeramezigrafy);x2=1.25amplitudaxmax;
y1=-1.1(3amplitudaymax+mezeramezigrafy);y2=1.25amplitudaymax;

cas0=0;casmin=0;casmax=5;deltacas=0.001;
fx0=1;fxmin=(1/10);fxmax=5;deltafx=(1/20);
fy0=1;fymin=(1/10);fymax=5;deltafy=(1/20);
fix0=0;fixmin=0;fixmax=2π;deltafix=(π/10);
fiy0=0;fiymin=0;fiymax=2π;deltafiy=(π/10);

tloustka=0.005;
velikostbodu=0.02;

barva=Black;
barvax=Blue;
barvay=Orange;
barvagrafu=Red;
barvabodu=Darker[Green];
barvahodnotax=Darker[barvax];
barvahodnotay=Darker[barvay];

LissajousovyObrazce=Manipulate[Deploy[
x[t_]:=ymx Sin[2π fx t+fix];
y[t_]:=ymy Sin[2π fy t+fiy];
bodx=Point[{-ymx+2 ymx cas,y[cas]-2amplitudaymax-mezeramezigrafy}];
body=Point[{x[cas]-2amplitudaxmax-mezeramezigrafy,-ymy+2 ymy cas}];
bod=Point[{x[cas],y[cas]}];
hodnotax1=Line[{{-ymx+2ymx cas,-2amplitudaymax-mezeramezigrafy},{-ymx+2ymx cas,y[cas]-2amplitudaymax-mezeramezigrafy}}];
hodnotay1=Line[{{-2amplitudaxmax-mezeramezigrafy,-ymy+2ymy cas},{x[cas]-2amplitudaxmax-mezeramezigrafy,-ymy+2 ymy cas}}];
hodnotax2=Line[{{x[cas],0},{x[cas],y[cas]}}];
hodnotay2=Line[{{0,y[cas]},{x[cas],y[cas]}}];
osax={
Arrowheads[{0,velikostbodu}],
Arrow[{{-1.1amplitudaxmax,0},{1.2amplitudaxmax,0}}]};
osay={
Arrowheads[{0,velikostbodu}],
Arrow[{{0,-1.1amplitudaymax},{0,1.2amplitudaymax}}]};
osaxx={
Arrowheads[{0,velikostbodu}],
Arrow[{{-1.2ymx,-2amplitudaymax-mezeramezigrafy},{1.2amplitudaxmax,-2amplitudaymax-mezeramezigrafy}}]};
osayx={
Arrowheads[{0,velikostbodu}],
Arrow[{{-ymx,-2amplitudaymax-mezeramezigrafy-amplitudaxmax},{-ymx,-0.9(2amplitudaymax+mezeramezigrafy-amplitudaxmax)}}]};
osaxy={
Arrowheads[{0,velikostbodu}],
Arrow[{{-1.07(2amplitudaxmax+mezeramezigrafy+amplitudaymax),-ymy},{-(2amplitudaxmax+mezeramezigrafy-amplitudaymax),-ymy}}]};
osayy={
Arrowheads[{0,velikostbodu}],
Arrow[{{-2amplitudaxmax-mezeramezigrafy,-1.2ymy},{-2amplitudaymax-mezeramezigrafy,1.2amplitudaymax}}]};
rovnice1=StringJoin[ToString[Style["(Subscript[y, horizontální])",barvay],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[ymx],barvay],StandardForm],ToString[Style[" sin(2π*",barva],StandardForm],ToString[Style[ToString[1.fx],barvay],StandardForm],ToString[Style["*t + ",barva],StandardForm],ToString[Style[ToString[fix,TraditionalForm],barvay],StandardForm],ToString[Style[")",barva],StandardForm]];
rovnice2=StringJoin[ToString[Style["(Subscript[y, vertkální])",barvax],StandardForm],ToString[Style[" = ",barva],StandardForm],ToString[Style[ToString[ymy],barvax],StandardForm],ToString[Style[" sin(2π*",barva],StandardForm],ToString[Style[ToString[1.fy],barvax],StandardForm],ToString[Style["*t + ",barva],StandardForm],ToString[Style[ToString[fiy,TraditionalForm],barvax],StandardForm],ToString[Style[")",barva],StandardForm]];

grafik=Show[
ParametricPlot[{x[t],y[t]},{t,0,LCM[(1/fx),(1/fy)]},PlotStyle->{barvagrafu,Thickness[0.5tloustka]},PerformanceGoal->"Quality",PlotRange->{{-3,1},{-3,1}}],
If[zobrazitgrafy,
{ParametricPlot[{t-amplitudaxmax ymx,y[(t/(2ymx))]-2amplitudaymax-mezeramezigrafy},{t,0,2amplitudaxmax ymx},PlotStyle->{barvax,Thickness[0.5tloustka]},PerformanceGoal->"Quality",PlotRange->{{-3,1},{-3,1}}],
ParametricPlot[{x[(t/(2ymy))]-2amplitudaxmax-mezeramezigrafy,t-amplitudaymax ymy},{t,0,2amplitudaymax ymy},PlotStyle->{barvay,Thickness[0.5tloustka]},PerformanceGoal->"Quality",PlotRange->{{-3,1},{-3,1}}]},
Plot[0,{t,1.1x2,1.11x2},Axes->False]],

Graphics[{
If[zobrazitgrafy,
{{barva,Thickness[0.5tloustka],osaxx},
{barva,Thickness[0.5tloustka],osayx},
{barva,Thickness[0.5tloustka],osaxy},
{barva,Thickness[0.5tloustka],osayy},
Text[Style["t",15,barva,FontFamily->Times],{1.1amplitudaxmax,-1.05(2amplitudaymax+mezeramezigrafy)},{Center,Center}],
Text[Style["y",15,barva,FontFamily->Times],{-1.1ymx,-(2amplitudaymax+mezeramezigrafy-amplitudaxmax)},{Center,Center}],
Text[Style["t",15,barva,FontFamily->Times],{-0.95(2amplitudaymax+mezeramezigrafy),1.05amplitudaymax},{Center,Center}],
Text[Style["x",15,barva,FontFamily->Times],{-1.08(2amplitudaxmax+mezeramezigrafy-amplitudaymax),-1.2ymy},{Center,Center}]},
Text[""]],
If[zobrazitbod&&zobrazitgrafy,
{{barva,Thickness[0.3tloustka],Dashed,osax},
{barva,Thickness[0.3tloustka],Dashed,osay},
Text[Style["x",15,barva,FontFamily->Times],{1.1amplitudaxmax,-0.1amplitudaymax},{Center,Center}],
Text[Style["y",15,barva,FontFamily->Times],{-0.1amplitudaxmax,1.1amplitudaymax},{Center,Center}],
{barvahodnotax,Thickness[0.5tloustka],hodnotax1},
{barvahodnotay,Thickness[0.5tloustka],hodnotay1},
{barvahodnotax,Thickness[0.5tloustka],hodnotax2},
{barvahodnotay,Thickness[0.5tloustka],hodnotay2},
{barvabodu,PointSize[velikostbodu],bod},
{barvabodu,PointSize[velikostbodu],bodx},
{barvabodu,PointSize[velikostbodu],body}},
Text[""]]
}],
FormatType->StandardForm,AspectRatio->Automatic,Axes->False,PlotRange->{{x1,x2},{y1,y2}},ImageSize->500
]],

Item[Style["Horizontální složka",15,barva,FontFamily->Times,Bold,Underlined]],
{{ymx,amplitudax0,Style["(Subscript[y, max_h])",15,barva]},amplitudaxmin,amplitudaxmax,deltaamplitudax,Appearance->"Labeled"},
{{fx,fx0,Style["(Subscript[f, h])",15,barva]},fxmin,fxmax,deltafx,Appearance->"Labeled"},
{{fix,fix0,Style["(Subscript[φ, h])",15,barva]},fixmin,fixmax,deltafix,Appearance->"Labeled"},
Delimiter,
Item[Style["Vertikální složka",15,barva,FontFamily->Times,Bold,Underlined]],
{{ymy,amplituday0,Style["(Subscript[y, max_v])",15,barva]},amplitudaymin,amplitudaymax,deltaamplituday,Appearance->"Labeled"},
{{fy,fy0,Style["(Subscript[f, v])",15,barva]},fymin,1.fymax,deltafy,Appearance->"Labeled"},
{{fiy,fiy0,Style["(Subscript[φ, v])",15,barva]},fiymin,fiymax,deltafiy,Appearance->"Labeled"},
Delimiter,
{{cas,cas0,Style["t",15,barva]},casmin,casmax,deltacas},
Delimiter,
Item[Style["Zobrazit:",15,barva,FontFamily->Times,Bold,Underlined]],
{{zobrazitgrafy,True,Style["dílčí grafy",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitbod,False,Style["bod v grafu",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitrovnice,True,Style["rovnice",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
Dynamic[
Grid[{
{If[zobrazitrovnice,
Item[Style[rovnice1,20,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitrovnice,
Item[Style[rovnice2,20,barva,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["Skládání kolmých kmitů - Lissajousovy obrazce",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.

LissajousovyObrazce