Grafy pro začátečníky a pokročilé
Mgr. Radim Kusák
Dvořákovo gymnázium a Střední odborná škola ekonomická, Kralupy na Vltavou
Ústav teoretické fyziky, Matematicko-fyzikální fakulta Univerzity Karlovy
radim.kusak@gmail.com

Začínáme

Úvodní poznámky

Než začnete

Než jste tento soubor otevřeli, tak se vám na počátku notebooku objevila nabídka, která chtěla povolit dynamický obsah. Není důvod se bát. Tento obsah se vztahuje k příkazům souvisejícím s Wolfram|Alpha a příkazem Manipulate.

Vzhled tohoto notebooku

Vhledu dokumentů se budeme věnovat v samostatné kapitole, na začátku nám bude stačit, že vzhled tohoto notebooku se nastavil v nabídce Format/Stylesheet/Creative/PastelColor.

Krátké opakovaní programu Mathematica

Jednoduché výpočty

Běžné příkazy jako +, -, /, * fungují jak jste běžně zvyklí např. na kalkulačce. Mocninu uděláte pomocí ^ (na anglické klávesnici klávesou shift + 6). 

Klávesovou zkratkou shift + enter, provedete výpočet.

Obecně doporučuji při zadávání příkazů používat anglickou klávesnici, ale samozřejmě je to otázkou zvyku, která klávesnice vám více vyhovuje.

1+1

Zadáváme příkazy

Příkazy v programu Mathematica začínají velkými písmeny. Pokud příkaz obsahuje více slov je každé začínající písmeno slova velkým písmenem. Příkazy se dají zadávat do programu Mathematica více způsoby. Jednotlivé z nich si ukážeme v sekci Jak vkládat grafy.

Plot[Sin[x], {x, 0, 10}]

Hranaté a složené závorky

Argumenty příkazů se zadávají v hranatých závorkách

Sin[(π/3)]

Ve složených závorkách se zadávají soubory (seznamy) čísel, funkcí případně i matice.

{1,2,3,4,5}

{Sin[x],Cos[x]}

{{1,2},{3,4}}
%//MatrixForm

Nápověda

To co dělá program Mathematica výborným programem není jen množství příkazů ale také výborná nápověda k nim. Napíšete-li příkaz plot a stiknete klávesu F1, zobrazí se vám nápověda k tomuto příkazu i s množstvím ukázek a různými nastaveními.

Proč práce s grafy

Vizualizace již známých problémů

ParametricPlot[{Sin[5t],Cos[3t]},{t,0,2*Pi}]

Jiný pohled na již známé věci, ale někdy i nový pohled na daný problém

Grid[{{ContourPlot[Sin[x+y^2],{x,-3,3},{y,-2,2}, ImageSize->300],Plot3D[Sin[x+y^2],{x,-3,3},{y,-2,2},MeshFunctions->{#3&},Mesh->5,MeshStyle->Thick, ImageSize->300]}}]

Jak vkádat grafy

Pomocí příkazů

ContourPlot[Cos[x]+Sin[y],{x,-10,10},{y,-10,10}]

Pomocí palet

V nabídce Palettes můžeme zvolit paletu příkazů např. Basic Math Assistant, případně Classroom Assistant

Plot3D[function,{(Subscript[var, 1]),min,max},{(Subscript[var, 2]),min,max}]

Plot3D[function,{(Subscript[var, 1]),min,max},{(Subscript[var, 2]),min,max}]

Pomocí Free Form

Pomocí www.wolframalpha.com

Pomocí klávesových zkratek

CTRL + K, CTRL + Shift + K (přípaně MAC CMD + K, CMD + Shift + K)

Pl

Plot3D[f,{x,(Subscript[x, min]),(Subscript[x, max])},{y,(Subscript[y, min]),(Subscript[y, max])}]

Pi
N[π,20]

(x^2)+x-1

Výrazy nebo funkce

Plot[(x^2)+x-1,{x,-3,3}]

vyraz=(x^2)+x-1

Plot[vyraz,{x,-3,3}]

f[x_]:=(x^2)+x-1

Plot[f[x],{x,-3,3}]

Grafy, Grafy, Grafy

?Plot

?*Plot*

?*Chart*

2D Grafy

Zobrazujeme “pěkné” funkce - příkaz Plot

Plot[(x^3)-(x^2)-x+1,{x,-2,2},PlotStyle->Thick]

{1,2,3}

Plot[{(x^3)-(x^2)-x+1,Sin[x],2x},{x,-2,2},PlotStyle->Thick]

Polární graf

PolarPlot[φ,{φ,0,4π},PlotStyle->Thick]

Grafy křivek a ploch zadaných parametricky

ParametricPlot[{Sin[5t],Cos[3t]},{t,0,2*Pi},PlotStyle->Thick]

Graf funkce zadané implicitně

Rovnice

Reduce[x+y==1&&x-y==2,{x,y}]

ContourPlot[{x+y==1,x-y==2},{x,-3,3},{y,-3,3}]

Kuželosečky

ContourPlot[
((x^2)/9)+((y^2)/4)==1,
{x,-5,5},{y,-5,5},ContourStyle->{Thick,Blue}]

Zobrazujeme oblasti - RegionPlot

RegionPlot[y>(x^2),{x,-2,2},{y,-1,4}]

RegionPlot[{y>(x^2),y<x+2},{x,-2,2},{y,-1,4}]

RegionPlot[y>(x^2)&&y<x+2,{x,-2,2},{y,-1,4}]

Zobrazení dat na velkých škálách

?Plot

LogPlot[{(x^x),(E^x),x!},{x,0,5},PlotStyle->Thick, PlotRange->Full]

LogPlot[{(10^x)},{x,0,10},PlotStyle->Thick, PlotRange->Full]

Zobrazení ekvipotenciál - Contour Plot II

ContourPlot[Sin[x] Sin[y],{x,-2,2},{y,-2,2}]

DensityPlot[Sin[x] Sin[y],{x,-2,2},{y,-2,2}]

Zobrazujeme proudnice

StreamPlot[{Cos[x] Sin[y],Cos[y] Sin[x]},{x,-2,2},{y,-2,2}]

StreamDensityPlot[{Cos[x] Sin[y],Cos[y] Sin[x]},{x,-2,2},{y,-2,2}]

Zobrazujeme vektorové pole

VectorPlot[{Cos[x] Sin[y],Cos[y] Sin[x]},{x,-2,2},{y,-2,2}]

VectorDensityPlot[{Cos[x] Sin[y],Cos[y] Sin[x]},{x,-2,2},{y,-2,2}]

3D grafy

Funkce dvou proměných

Plot3D[Sin[x] Sin[y],{x,-2,2},{y,-2,2}]

Grafy křivek a ploch zadaných parametricky 3D

ParametricPlot3D[{Sin[u],Cos[u],u/10},{u,0,20},PlotStyle->{Thick,Blue}]

Graf funkce zadané implicitně 3D

Rovnice

Reduce[{x+y+z==1,x-y+z==2,x-z==3},{x,y,z}]

ContourPlot3D[{x+y+z==1,x-y+z==2,x-z==3},{x,-10,10},{y,-10,10},{z,-10,10},ContourStyle->{Red,Green,Blue}]

Reduce[{x+y+z==1,x-y+z==2,x+z==3},{x,y,z}]

ContourPlot3D[{x+y+z==1,x-y+z==2,x+z==3},{x,-10,10},{y,-10,10},{z,-10,10},ContourStyle->{Red,Green,Blue}]

Hezké grafy

ContourPlot3D[Sin[x] Sin[y]+(z^2)==(1/2),{x,-2,2},{y,-2,2},{z,-2,2}]

Zobrazení více typů grafů v jednom

p1=Plot3D[x^3+y^2,{x,-3,3},{y,-5,5},PlotStyle->{Red}];
p2=ParametricPlot3D[{Sin[t],Cos[t],u},{t,0,2Pi},{u,-50,50},PlotStyle->Blue];
Show[p1,p2]

Měníme nastavení grafu

Options[Plot]

Měníme vzhled jedné funkce

Plot[(x^3)-(x^2)-x+1,{x,-2,2},
PlotStyle->Dashed]

Plot[(α^3)-(α^2)-α+1,{α,-2,2},
PlotStyle->{Blue,Thickness[0.01],Dashed}]

Stejné nastavení pro všechny funkce ve grafu

Plot[{(x^3)-(x^2)-x+1,Sin[x],2x},{x,-2,2},
PlotStyle->Thick
]

Každá funkce podle našich představ

Plot[{(x^3)-(x^2)-x+1,Sin[x],2x,x},{x,-2,2},
PlotStyle->{{Thick,Red},Green,Blue,Pink}
]

ParametricPlot3D[{1.16^v Cos[v](1+Cos[u]),-1.16^v Sin[v](1+Cos[u]),-2 1.16^v(1+Sin[u])},{u,0,2Pi},{v,-15,6},Mesh->None,PlotStyle->Opacity[0.6],PlotRange->All,PlotPoints->25]

Popisujeme grafy

Pomocí Drawing Tools

Plot[Sin[x],{x,0,2Pi},PlotStyle->Thick]

Pomocí Options grafu, případně příkaz Show

Show[{Plot[Sin[x],{x,0,2Pi},PlotStyle->Thick,
Epilog->{Inset["Tady je nulový bod",{4,0.5}]}
],Graphics[{Arrowheads[Large],Arrow[{{4,0.4},{Pi,0}}]}]}]

Titulek grafu

Plot[Sin[x],{x,0,2Pi},
PlotLabel->Style["Graf funkce sin(x)",Bold,Blue,32],
PlotStyle->Thick]

Popisujeme osy

Plot[Sin[x],{x,0,2Pi},PlotStyle->Thick,AxesLabel->{"x","y"}]

Měníme hodnoty na ose

Vypisujeme hodnoty “ručně”

Plot[Sin[x],{x,-1,10},PlotStyle->Thick,
Ticks->{{0,π,2π,3π},{-1,0,1}},TicksStyle->{{Bold,24,Red},{Bold,24,Green}}]

Vypisujeme hodnoty tabulkou

Plot[Sin[x],{x,-1,10},PlotStyle->Thick,
Ticks->{Table[(i/2)*π,{i,0,6}],{-1,0,1}},TicksStyle->{{Bold,24,Red},{Bold,24,Green}}]

Zvýrazňujeme body ve grafu

Plot[{Sin[x],Cos[x]},{x,0,6Pi},Epilog->{PointSize[Large],Point[{(Pi/4),Sin[(Pi/4)]}]},
PlotStyle->Thick]

Plot[{Sin[x],Cos[x]},{x,0,6Pi},
Mesh->{{0}},MeshFunctions->{Sin[#]-Cos[#]&},MeshStyle->PointSize[Large],
PlotStyle->Thick]

Obarvujeme funkci podle jejích vlastností

Definice funkce

f2[x_]:=(x^3)-(x^2)-x+1

První derivace

Plot[f2[x],{x,-2,2},MeshFunctions->{f2'[#]&},Mesh->{{0}},MeshStyle->PointSize[Large], MeshShading->{Red, Blue},
 PlotStyle->Thick]

Druhá derivace

Plot[f2[x],{x,-2,2},MeshFunctions->{f2''[#]&},Mesh->{{0}},MeshStyle->PointSize[Large], MeshShading->{Red, Blue},
 PlotStyle->Thick]

Kreslíme složitější funkce

Plot[Tan[x],{x,-Pi,Pi}, 
PlotStyle->Thick
]

Plot[Tan[x],{x,-Pi,Pi}, 
PlotStyle->Thick,
Exclusions->{-(Pi/2),(Pi/2)}
]

Plot[Sin[1/x],{x,0,5}]

Plot[Sin[1/x],{x,0,0.2},PlotPoints->1000]

Kreslíme hezké grafy

Plot3D[((x y ((x^2)-(y^2)))/((x^2)+(y^2))),{x,-2,2},{y,-2,2},Boxed->False,PlotStyle->{FaceForm[Lighter@Blue,Lighter@Green],Specularity[White,30]},Lighting->"Neutral"]

Manipulate a nastavení grafu

Manipulate[Grid[{
{Plot[a*f[b*x],{x,-10,10},PlotRange->{{-10,10},{-3,3}},PlotStyle->{Thickness[tloustka],barvy},ImageSize->500,
Evaluate[If[vypln,Filling->Axis,Filling->None]],
PlotLabel->Style["Graf funkcí",32,Bold]]},{a*f[b*x]}}],
{{a,1},-2,2},{{b,1},-3,3},{{tloustka,0.01},0,0.1},{barvy,ColorSlider},{f,{Sin,Cos,Sqrt,Log,Exp,Function[x,(x^3)-x+1]}},{{vypln,False},{True,False}}]

Manipulate[Show[
Plot[{Sin[x],a Sin[b x+c]+d},{x,-Pi/6,2Pi+Pi/6},PlotRange->{{-Pi/6,2Pi+Pi/6},{-2.5,2.5}},Ticks->{{-Pi/2,-Pi/6,0,Pi/6,Pi/2,Pi,3/2Pi,2Pi}},TicksStyle->Directive[36],PlotStyle->{{Black,Thickness[0.004]},{Blue,Thickness[0.007]}},PlotLabel->Style["Graf funkce a·sin(bx+c)+d",48],Background->LightMagenta],ImageSize->800],{{a,1,"a"},-2,2,0.1},{{b,1,"b"},-2,2,0.1},{{c,0,"c"},-2Pi,2Pi, Pi/6},{{d,0,"d"},-2,2,0.1}]

Importujeme data

Nahrání dat

data=Rest@Import[NotebookDirectory[]<>"var_konvice.csv"];

Vybrání jen některých dat

data2=Take[data,{50,250}];

Zobrazení dat

dataz=ListPlot[data,AxesOrigin->{0,0}]
dataz2=ListPlot[data2,AxesOrigin->{0,0}]

Pro pobavení

Program Mathematica můžeme používat jako velmi silný výpočetní nástroj, ale zamozřejmě neuškodí i trochu zábavy.

TyckovyPlot[a_,b_,c_]:=
Graphics[Join[{Thick},{Brown},
Table[Line[{{0,b*(i/3)},{a,b*(i/3)}}],{i,{1,2}}],Table[Line[{{i,0},{i,b}}],{i,0,a,(a/(c+1))}],{Line[{{a,0},{a,b}}]}],PlotRange->{{0,1.01*a},{0,1.2*b}}]

První parametr udává délku plotu, druhý jeho výšku a poslední počet kulíků uvnitř plotu.

TyckovyPlot[15,3.5,7]

Řešíme náročnější úlohy - Parašutista

Zadání úlohy

Budeme zkoumat jakou rychlostí dopadne optimistický parašutista, který skočí z letadla bez padáku. Podíváme se na jeho pohyb bez odporové síly a s odporovou silou.
Poznámka: Tato úloha obsahuje diferenciální rovnice, takže je spíše vhodná na fyzikální seminář. Tento příklad se dá také ukázat i v běžné hodině fyziky, potřebný aparát pro výpočet pak ale bude pro studenty “černou skříňkou”.

Řešení úlohy

Hodnoty

hodnoty={C->1,S->1,m->80,g->9.81,h->2000,ρ->1.25}

Řešení pohybu parašutisty

Na parašutistu působí tíhová síla a pak pokud ji uvažujeme také i odporová síla. Ty dávají parašutistovi zrychlení dané druhým newtonovým zákonem.

First@DSolve[{m*D[y[t],t,t]==-m*g+(1/2)C*S*ρ*D[y[t],t]^2},y[t],t]//FullSimplify

Řešení pohybu bez odporu vzduchu

reseni=First@DSolve[{m*D[y[t],t,t]==-m*g,y[0]==h,y'[0]==0},y[t],t]//FullSimplify

Řešení pohybu s odporem vzduchu

reseniod=First@DSolve[{m*D[y[t],t,t]==-m*g+(1/2)C*S*ρ*D[y[t],t]^2,y[0]==h,y'[0]==0},y[t],t]//FullSimplify

Řešení pro konkrétní hodnoty

resenic=reseni/.hodnoty

reseniodc=reseniod/.hodnoty

Graf závislosti výšky na čase

Modře je pohyb bez odporu vzduchu, červeně s odporem vzduchu.

Plot[{Evaluate@y[t]/.resenic,Evaluate@y[t]/.reseniodc},{t,0,100},PlotRange->{Full,{0,2200}},PlotStyle->{{Blue,Thick},{Red,Thick}}]

Doba dopadu

dobadopadu=Solve[(y[t]/.resenic)==0&&t>0,t]

dobadopaduod=Solve[(y[t]/.reseniodc)==0&&t>0,t]

Rychlost parašutisty

Důležitá poznámka: záporná rychlost nám říká, že parašutista se pohybuje směrem “dolů”, tzn. opačně než směřuje osa y.

Obecně

rychlost=D[reseni,t]

rychlostod=D[reseniod,t]

Číselně

rychlostc=rychlost/.hodnoty

rychlostcod=rychlostod/.hodnoty

Rychlost dopadu

Bez odporu vzduchu

y'[t]/.rychlostc/.dobadopadu

S odporem vzduchu

y'[t]/.rychlostcod/.dobadopaduod

Je vidět, že rychlost bez odporu vzduchu je asi 5 větší než bez odporu vzduchu. Což pro optimistického parašutistu může hrát při dopadu rozhodující roli.

Závislost rychlosti parašutisty na čase

Graf rychlosti na čase bez odporu vzduchu

p1=Plot[Evaluate@y'[t]/.rychlostc,{t,0,t/.dobadopadu[[1]]},PlotStyle->{Blue,Thick},AxesOrigin->{0,0}]

Graf rychlosti na čase s odporem vzduchu

p2=Plot[Evaluate@y'[t]/.rychlostcod,{t,0,t/.dobadopaduod[[1]]},PlotStyle->{Red,Thick},AxesOrigin->{0,0}]

Graf rychlosti na čase s a bez odporu vzduchu

Show[p1,p2]

Jak na grafy?

V rámci programu Mathematica
howto/CreatePlots
guide/FunctionVisualization
guide/GraphicsOptionsAndStyling

Projít si příslušné příkazy na kreslení grafů např. Plot

Online videa
http://www.wolfram.com/broadcast/#Tutorials-Graphics

Odkazy
http://utf.mff.cuni.cz/~kusak/mathematica.php
http://www.karlin.mff.cuni.cz/~slavik/info.html
http://www.karlin.mff.cuni.cz/~hurt/
http://www.mathematica-forum.cz/materialy.htm