Více o grafech, křivkách a plochách

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

Opakování

Anonymní funkce

= nepojmenované funkce, obvykle na jedno použití

({{Anonymní funkce jedné proměnné, Anonymní funkce více proměnných}, {Function[proměnná, předpis], Function[seznam proměnných, předpis]}, {proměnná |-> předpis, seznam proměnných |-> předpis}})

Příklad: NestList[f,x,n] spočte prvních n iterací funkce f v bodě x.

NestList[Function[x,1+(Sqrt[x])],2,5]

NestList[x|->1+(Sqrt[x]),2,5]

Options

Chování většiny funkcí v Mathematice lze ovlivňovat pomocí voleb (options). Jejich význam je popsán v dokumentaci.

Options[Plot]

Adaptivní vykreslování

Graf funkce jedné proměnné je ve skutečnosti lomenou čarou spojující velké množství bodů. Lze se o tom přesvědčit pomocí InputForm nebo FullForm:

Plot[Sin[x],{x,0,4π}]

InputForm[%]

V místech s velkou křivostí je hustota kontrolních bodů největší (tj. úsečky jsou nejkratší). Pomocí Mesh->All lze zobrazit všechny kontrolní body:

Plot[Sin[x],{x,0,4 π},Mesh->All,MeshStyle->{Black,PointSize[Large]},PlotStyle->{Thick,Red}]

Adaptivní algoritmus konstruuje kontrolní body takto:

Na začátku zvolí jistý počet ekvidistantních bodů na ose x (volba PlotPoints, výchozí hodnota je 50), vypočte v nich funkční hodnoty a spojí takto vzniklé body lomenou čarou.

Pokud je velikost úhlu mezi dvěma sousedními úsečkami větší než 5 ˚, pak se oba příslušné intervaly rozpůlí; maximální počet takovýchto půlení je určen volbou MaxRecursion.

10 počátečních bodů (PlotPoints->10) a zákaz půlení (MaxRecursion->0):

Plot[Sin[x],{x,0,4 π},Mesh->All,MeshStyle->{Black,PointSize[Large]},PlotStyle->{Thick,Red},PlotPoints->10,MaxRecursion->0]

Povoleno jedno půlení:

Plot[Sin[x],{x,0,4 π},Mesh->All,MeshStyle->{Black,PointSize[Large]},PlotStyle->{Thick,Red},PlotPoints->10,MaxRecursion->1]

Manipulate[Plot[Sin[x],{x,0,4 π},Mesh->mesh,MeshStyle->{Black,PointSize[Large]},PlotStyle->{Thick,Red},PlotPoints->plotpoints,MaxRecursion->maxrecursion],{maxrecursion,0,15,1,Appearance->"Labeled"},{plotpoints,4,50,1,Appearance->"Labeled"},{mesh,{All,None}}]

Adaptivní vykreslování používají i další funkce (Plot3D, ParametricPlot atd.).

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5}]

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5}, Mesh->All]

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5}, Mesh->All, MaxRecursion->0, PlotPoints->10]

Graf funkce dvou proměnných je poskládán z trojúhelníků:

Normal[InputForm[Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5},  MaxRecursion->0, PlotPoints->10]]]

Další použití Mesh

Mesh ve 3D grafice

Grafy funkcí dvou proměnných a parametrizované plochy bývají pokryty sítí křivek, které představují obrazy přímek rovnoběžných s osami.

ParametricPlot3D[{(4+v Cos[(u/2)]) Cos[u],(4+v Cos[(u/2)]) Sin[u],v Sin[(u/2)]},{u,0,2 π},{v,-1,1},Boxed->False]

Pomocí Mesh->None lze křivky potlačit:

ParametricPlot3D[{(4+v Cos[(u/2)]) Cos[u],(4+v Cos[(u/2)]) Sin[u],v Sin[(u/2)]},{u,0,2 π},{v,-1,1},Boxed->False, Mesh->None]

Mesh->{m,n} specifikuje počty křivek v obou směrech:

ParametricPlot3D[{(4+v Cos[(u/2)]) Cos[u],(4+v Cos[(u/2)]) Sin[u],v Sin[(u/2)]},{u,0,2 π},{v,-1,1},Boxed->False, Mesh->{60,2}]

Styl čar a hranice je určen volbami MeshStyle a BoundaryStyle:

ParametricPlot3D[{(4+v Cos[(u/2)]) Cos[u],(4+v Cos[(u/2)]) Sin[u],v Sin[(u/2)]},{u,0,2 π},{v,-1,1},Boxed->False, Mesh->{60,2}, MeshStyle->Thick,BoundaryStyle->{Thick,Red}]

Mesh ve dvourozměrném případě

Mesh->n vyznačí body grafu, které odpovídají dělení definičního oboru na n+1 stejně dlouhých podintervalů.

Plot[Sin[x],{x,0,4 π},Mesh->7,MeshStyle->PointSize[Large]]

Jinou variantou je přímo uvést x-ové souřadnice bodů, které chceme vyznačit.

Plot[Sin[x],{x,0,4 π},Mesh->{{1,2,3}},MeshStyle->PointSize[Large]]

Zajímavějších výsledků lze dosáhnout spojením Mesh s volbou MeshFunctions. Na grafu pak budou vyznačeny body, ve kterých funkce zadaná v MeshFunctions nabývá hodnot specifikovaných v Mesh.

Výchozí nastavení MeshFunctions pro Plot je Function[{x,y},x]:

Plot[Sin[x],{x,0,4 π},Mesh->{{1,2,3}},MeshStyle->PointSize[Large],MeshFunctions->{Function[{x,y},x]}]

Plot[Sin[x],{x,0,4 π},Mesh->{{-1/2,1/2}},MeshStyle->PointSize[Large],MeshFunctions->{Function[{x,y},y]}]

Vyznačení všech nulových bodů funkce:

Plot[-12-58 x+(x^2)+(x^3),{x,-10,10},MeshFunctions->{Function[{x,y},y]},Mesh->{{0}},MeshStyle->{Black,PointSize[Large]}]

Vyznačení průsečíků grafů dvou funkcí:

f[x_]:=27 x+130;
g[x_]:=-12-58 x+(x^2)+(x^3);

Plot[{f[x],g[x]},{x,-10,10},MeshFunctions->{Function[{x,y},f[x]-g[x]]},Mesh->{{0}},MeshStyle->{Black,PointSize[Large]}, PlotStyle->{{Red},{Blue}}]

Clear[f,g]

Varování:  Algoritmus obvykle nevyznačí body na krajích definičního oboru a body, ve kterých se nabývá lokálních extrémů:

Plot[Sin[x],{x,0,4Pi},Mesh->{{0}},MeshStyle->PointSize[Large],MeshFunctions->{Function[{x,y},y]}]

Plot[3Cos[x]+x^2-3,{x,-2.5,2.5},Mesh->{{0}},MeshStyle->PointSize[Large],MeshFunctions->{Function[{x,y},y]}]

Znázornění vrstevnic na grafu funkce dvou proměnných

f[x_,y_]:=((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2)))

plot=Plot3D[f[x,y],{x,-2,2},{y,-2.5,2.5}, BoxRatios->Automatic]

Vyznačení vrstevnic odpovídajících hodnotám 0.25, 0.50, 0.75, ..., 2.75:

Plot3D[f[x,y],{x,-2,2},{y,-2.5,2.5}, BoxRatios->Automatic, MeshFunctions->{Function[{x,y,z},z]},Mesh->{Range[0.25,2.75,0.25]}, MeshStyle->Thick]

Střídání barev vrstevnic:

Plot3D[f[x,y],{x,-2,2},{y,-2.5,2.5}, BoxRatios->Automatic, MeshFunctions->{Function[{x,y,z},z],Function[{x,y,z},z]},Mesh->{Range[0.25,2.75,0.5],Range[0.5,2.5,0.5]}, MeshStyle->{{Thick,Orange},{Thick,Blue}}]

Alternativa: Spojení Plot3D a ContourPlot

cplot=ContourPlot[f[x,y],{x,-2,2},{y,-2.5,2.5},ContourStyle->Thick]

Show[plot,Graphics3D[cplot[[1]]/.{x_Real,y_Real}->{x,y,-2}],PlotRange->{{-2,2},{-2.5,2.5},{-2,3}},BoxRatios->Automatic]

Volba MeshShading

f[x_,y_]:=((y^2)/2)-((x^2)/2)+((x^3)/3)

plot=Plot3D[f[x,y],{x,-2,2},{y,-2,2},Boxed->False]

cplot=ContourPlot[f[x,y],{x,-2,2},{y,-2,2},ContourStyle->Thick,Contours->{-2,-1,-0.5,-0.3,-0.1,0,0.1,0.3,0.5,1,2}, PlotRangePadding->None]

Plot3D[f[x,y],{x,-2,2},{y,-2,2},Boxed->False, Mesh->{{-2,-1,-0.5,-0.3,-0.1,0,0.1,0.3,0.5,1,2}}, MeshFunctions->{Function[{x,y,z},z]}, MeshStyle->Thick, PlotPoints->60]

MeshShading je seznam barev, které se použijí v oblastech mezi křivkami určenými Mesh a MeshFunctions:

Plot3D[f[x,y],{x,-2,2},{y,-2,2},Boxed->False, Mesh->{{-2,-1,-0.5,-0.3,-0.1,0,0.1,0.3,0.5,1,2}}, MeshFunctions->{Function[{x,y,z},z]}, MeshStyle->Thick, MeshShading->{Pink,White}, PlotPoints->60,Lighting->"Neutral"]

MeshShading ve 2D:

Plot[-12-58 x+(x^2)+(x^3),{x,-10,10},MeshFunctions->{Function[{x,y},y]},Mesh->{{0}},MeshStyle->{Black,PointSize[Large]}, PlotStyle->Thick, MeshShading->{Red, Blue}]

Volba ColorFunction

Obarvovací funkce

Pomocná funkce pro testování obarvovacích funkcí:

testColors[f_,min_:0,max_:1]:=DensityPlot[x,{x,min,max},{y,0,1},ColorFunction->f,Axes->{True,False},Frame->False,ImageSize->600,AspectRatio->1/6,ColorFunctionScaling->False,PlotPoints->100]

Hue vrací barevné odstíny, je periodická s periodou 1.

testColors[Hue,0,3]

Funkce, která na intervalu [0,1] přechází od modré k červené:

blueToRed[t_]:=Hue[0.5+0.5*t]

testColors[blueToRed]

Další předdefinované obarvovací funkce jsou k dispozici v ColorData (všechny jsou definovány na [0,1]):

ColorData["Gradients"]

testColors[ColorData["SunsetColors"]]

Manipulate[testColors[ColorData[col]],{col,ColorData["Gradients"]}]

Barvení grafů, křivek a ploch

Grafy, křivky a plochy lze barvit pomocí libovolné obarvovací funkce. Použijeme volbu ColorFunction s funkcí, která specifikuje barvu bodu v daném místě.

Plot[Abs[Sin[x]],{x,0,2π},PlotStyle->Thick,ColorFunction -> Function[{x,y},Hue[y]], AspectRatio->Automatic, ImageSize->700]

Hodnoty předávané obarvovací funkci jsou při výchozím nastavení lineárně transformovány do intervalu [0,1]; tuto vlastnost lze vypnout pomocí ColorFunctionScaling->False.

Plot3D[x+y,{x,0,2},{y,0,2},ColorFunction->Function[{x,y,z},Hue[z]], AxesLabel->{"x","y","z"}]

Plot3D[x+y,{x,0,2},{y,0,2},ColorFunction->Function[{x,y,z},Hue[z]], ColorFunctionScaling->False, AxesLabel->{"x","y","z"}]

c[t_]:={Cos[t]+0.2 Cos[26 t]+0.4 Cos[28 t]+0.8Sin[10 t]-0.4 Sin[17 t]-0.2 Sin[37 t],-0.8 Cos[10 t]-0.4 Cos[17 t]+0.2Cos[37 t]+Sin[t]-0.2 Sin[26 t]+0.4 Sin[28 t]};

ParametricPlot[c[t],{t,0,2Pi}, PlotStyle->Thick]

ParametricPlot[c[t],{t,0,2Pi}, PlotStyle->Thick, ColorFunction->Function[{x,y,t},Hue[t]]]

ParametricPlot[c[t],{t,0,2Pi}, PlotStyle->Thick, ColorFunction->Function[{x,y,t},Hue[x]]]

Použití předdefinovaných barevných schémat (obarvení podle souřadnice z):

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5},ColorFunction->Function[{x,y,z},ColorData["SunsetColors"][z]], BoxRatios->Automatic]

Zkrácený zápis:

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5},ColorFunction->"SunsetColors", BoxRatios->Automatic]

Příklad použití ColorFunction v kombinaci s ContourPlot:

ContourPlot[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5},ColorFunction->ColorData["Temperature"]]

Obarvení parametrizované křivky podle rychlosti

Příklad k ilustraci Keplerových pohybových zákonů:

trajektorie=NDSolveValue[{X''[t]==-((X[t])/((Norm[X[t]])^3)),X[0]=={0.5,0},X'[0]=={0,1}},X,{t,0,2 π}]

ParametricPlot[trajektorie[t],{t,0,2 π}]

rychlost[t_]=Norm[D[trajektorie[t],t]]

Plot[rychlost[t],{t,0,2 π},Ticks->{Range[0,2π,π/2],Automatic}]

max=Maximize[{rychlost[t],0≤t≤2 π},t]//First

min=Minimize[{rychlost[t],0≤t≤2 π},t]//First

normalizovanaRychlost[t_]=((rychlost[t]-min)/(max-min));

Plot[normalizovanaRychlost[t],{t,0,2 π},Ticks->{Range[0,2π,π/2],Automatic}]

ParametricPlot[trajektorie[t],{t,0,2 π}, ColorFunction->Function[{x,y,t},blueToRed[normalizovanaRychlost[t]]], ColorFunctionScaling->False]

Poznámka: Vypínáme ColorFunctionScaling, neboť v obarvovací funkci potřebujeme znát skutečnou hodnotu času t, nikoliv škálovanou hodnotu.

Volba PlotTheme

„Témata“ specifikují barvy, tloušťky čar, fonty a další vlastnosti v příkazech Plot, Plot3D, ContourPlot, ListPlot a dalších bez nutnosti nastavovat každou vlastnost zvlášť. Výběr tématu se provádí volbou PlotTheme, seznam témat lze najít v dokumentaci.

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

Plot[{Sin[x],Cos[x],Sin[x]+Cos[x]},{x,0,10},PlotTheme->"Detailed"]

Manipulate[Plot[{Sin[x],Cos[x],Sin[x]+Cos[x]},{x,0,10},PlotTheme->theme],{theme,{Automatic,"Detailed","Monochrome","Business","Scientific","Marketing","Minimal","Web","Classic"}}]

Manipulate[Plot3D[x y(x^2-y^2)/(x^2+y^2),{x,-2,2},{y,-2,2},PlotTheme->theme],{theme,{Automatic,"Detailed","Monochrome","Business","Scientific","Marketing","Minimal","Web","Classic"}}]

Manipulate[ListPlot[Table[Style[{Cos[t],Sin[2t]},Hue[t/(2Pi)]],{t,0,2Pi,Pi/20}],PlotStyle->PointSize[Medium],PlotTheme->theme],{theme,{Automatic,"Detailed","Monochrome","Business","Scientific","Marketing","Minimal","Web","Classic"}}]

Manipulate[BarChart[{{2,3,5},{7,11,13}},PlotTheme->theme],{theme,{Automatic,"Detailed","Monochrome","Business","Scientific","Marketing","Minimal","Web","Classic"}}]

Témata lze kombinovat s dalšími volbami.

Plot[{Sin[x],Cos[x],Sin[x]+Cos[x]},{x,0,10},PlotTheme->"Marketing"]

Plot[{Sin[x],Cos[x],Sin[x]+Cos[x]},{x,0,10},PlotTheme->"Marketing",BaseStyle->20]

Některá témata lze kombinovat mezi sebou:

Plot[{Sin[x],Cos[x],Sin[x]+Cos[x]},{x,0,10},PlotTheme->"BoldColor"]

Plot[{Sin[x],Cos[x],Sin[x]+Cos[x]},{x,0,10},PlotTheme->{"Marketing","BoldColor"}]

Plot3D[x^2+y^2,{x,-2,2},{y,-2,2},PlotTheme->"ZMesh"]

Plot3D[x^2+y^2,{x,-2,2},{y,-2,2},PlotTheme->{"Detailed","ZMesh"}]

Definice nových témat (nedokumentované příkazy):

Themes`AddThemeRules["noveTema","Plot",PlotStyle->{Red,Thick},Background->LightGray];(*nastavení specifické pro Plot*)
Themes`AddThemeRules["noveTema",_,Frame->True,Axes->False,BaseStyle->14];(*nastavení pro ostatní funkce*)

ParametricPlot[t{Cos[t],Sin[t]},{t,0,4π},PlotTheme->"noveTema"]

Plot[Sin[x],{x,0,2π},PlotTheme->"noveTema"]

Smazání tématu:

Themes`ClearThemeRules["noveTema"]

Cvičení

Pro funkce jedné reálné proměnné platí následující věta, kterou lze snadno dokázat pomocí Rolleovy věty.

Věta. Má-li diferencovatelná funkce f:ℝ->ℝ právě jedno lokální maximum (minimum) a žádné další stacionární body (body s nulovou derivací), pak jde o globální maximum (minimum).

Pro funkce více proměnných analogická věta neplatí, protipříkladem je např. funkce f:(ℝ^2)->ℝ definovaná předpisem

({{({{f(x,y)=3 x (e^y)-(x^3)-(e^(3 y))}}).}})

Ukažte, že tato funkce má právě jedno lokální maximum a žádné další stacionární body, nejedná se však o globální maximum.

Najděte přesné polohy všech stacionárních bodů funkce f (vypočítejte parciální derivace, položte je rovné nule a řešte soustavu rovnic).

Ukažte, že jediný stacionární bod funkce f je jejím lokálním maximem. Použijte vhodné kritérium z matematické analýzy pro zjištění typu stacionárního bodu (lze např. zkoumat vlastní čísla Hessovy matice v daném bodě).

Použijte Plot3D k sestrojení grafu funkce f, ze kterého bude zřetelné, že nalezené lokální maximum není globálním maximem. Vyznačte na grafu vhodně zvolené vrstevnice, oblasti mezi nimi obarvěte dvěma střídajícími se barvami. K vytvoření pěkného obrázku se vám může hodit volba PlotRange s vhodným rozsahem hodnot.

Použijte ContourPlot k sestrojení dvourozměrného obrázku s vrstevnicemi funkce f, ze kterého bude zřetelné, že nalezené lokální maximum není globálním maximem. Pomocí volby Contours vyberte vhodné hodnoty vrstevnic. Použijte vhodné barevné schéma nebo obarvovací funkci. Pomocí PlotLegends->Automatic zobrazte příslušnou barevnou stupnici. Stejně jako v předchozí části se vám může hodit volba PlotRange.