5. Globální a lokální pravidla, 
matematická analýza pro začátečníky a pokročilé

Globální pravidla

Nejjednodušším příkladem globálního (přepisovacího) pravidla je přiřazení hodnoty proměnné:

x=5

Kdykoliv Mathematica narazí na levou stranu pravidla, nahradí ji pravou stranou:

2x+y

Clear[x]

Na levé i na pravé straně pravidla může být libovolný korektně utvořený výraz:

f[x]=x^2+3x+2

D[f[x],x]

V paměti je uloženo pravidlo pro f[x], nikoliv pro f[2]:

f[2]

Clear[f]

Je-li nějaký identifikátor na levé straně pravidla následován podtržítkem (např. x_ ), znamená to, že na jeho místě může stát libovolný výraz.

f[x_]=x^2+3x+2

f[2]

f[a+b]

Clear[f]

Jaký je rozdíl mezi = a :=?

Při zadání globálního pravidla (pomocí =) se nejprve vyhodnotí pravá strana, poté se pravidlo uloží.

x=RandomReal[] (* RandomReal[] vrací náhodné číslo z intervalu [0,1] *)

?x

Při zadání globálního pravidla s odloženým vyhodnocením (pomocí :=) se pravidlo ihned uloží, pravá strana se vyhodnocuje až při použití pravidla.

x:=RandomReal[]

?x

x

x

Clear[x]

Kdy je důležité rozlišovat = a :=?

f[x_]=D[x^2,x] (* zde nelze použít := *)

f[1]

Pokud bychom definovali f[x_]:=D[x^2,x], pak zadání f[1] by vedlo na vyhodnocení D[1^2,1], což nedává smysl (druhý argument D musí být název proměnné).

Clear[f]

g[n_]:=Plot[x^n,{x,0,1}](* zde nelze použít = *)

g[2]

Pokud bychom definovali g[n_]=Plot[x^n,{x,0,1}], došlo by k okamžitému vyhodnocení Plot, který vrátí prázdný obrázek (protože nezná hodnotu n).

Clear[g]

Rekurentní definice faktoriálu:

f[1]:=1

f[n_]:=n f[n-1](* zde nelze použít =, okamžité vyhodnocení pravé strany by vedlo k "zacyklení" *)

Table[f[n],{n,1,10}]

$RecursionLimit je maximální povolená hloubka rekurze (snaha o ochranu před zacyklením):

$RecursionLimit

f[1200]

$RecursionLimit=Infinity

f[1200]

Clear[f]

Globální pravidla se aplikují v pořadí od méně obecného k obecnějšímu. Jsou-li některá pravidla "stejně obecná", pak záleží na pořadí, v jakém jsme je zadali.

f[x_,2]:=1

f[2,y_]:=0

f[2,2]

Clear[f]

Lokální pravidla

Lokální pravidla se používají k jednorázovému nahrazení výrazu jiným výrazem:

x+y /.x->2

Příklad: Hodnota derivace funkce v zadaném bodě.

D[x^2,x]/.x->1

Více lokálních pravidel aplikovaných současně:

x+y /.{x->1,y->2}

a/b /.{a->b,b->a} (* nahrazování probíhá paralelně, nikoliv nejprve a->b a poté b->a *)

Aplikace seznamu seznamů pravidel:

x+y /.{{x->1,y->2},{x->3,y->4}}

Mnoho funkcí v Mathematice vrací výsledek ve tvaru lokálních pravidel.

Solve[x^4-4x^2+1==0,x]

Zkusme zkontrolovat, že součin kořenů je 1. Součin všech prvků libovolného seznamu lze získat pomocí Apply[Times,seznam] (podrobnější informace o Apply budou v dalších kurzech).

s=x/.%

Apply[Times,s]

Simplify[%]

Totéž v jednom kroku:

Simplify[Apply[Times,x/.Solve[x^4-4x^2+1==0,x]]]

Rozdíl mezi -> a :> je stejný jako u globálních pravidel:

{a,x,b,x,c,x}/.x->RandomReal[] (* lokální pravidlo s okamžitým vyhodnocením *)

{a,x,b,x,c,x}/.x:>RandomReal[](* lokální pravidlo s odloženým vyhodnocením *)

Na rozdíl od globálních pravidel se lokální pravidla aplikují vždy v tom pořadí, ve kterém je zadáme:

f[2,2]/.{f[x_,2]->0,f[2,2]->1}

f[2,2]/.{f[2,2]->1,f[x_,2]->0}

Jednorázová vs. opakovaná aplikace lokálních pravidel:

{a,b,c,a,b,c}/.{a->b,b->c}

{a,b,c,a,b,c}//.{a->b,b->c}

Limity funkcí a posloupností

Limit[Sin[x]/x,x->0]

Jednostranné limity:

Limit[1/x,x->0]

Limit[1/x,x->0,Direction->"FromAbove"]

Limit[1/x,x->0,Direction->"FromBelow"]

Limita funkce dvou proměnných:

Limit[(x^3+y^3)/(x^2+y^2),{x,y}->{0,0}]

Limita funkce vs. limita posloupnosti:

Limit[Sin[n*2Pi],n->Infinity]

DiscreteLimit[Sin[n*2Pi],n->Infinity]

Limes inferior/superior pro funkce a posloupnosti:

MinLimit[Sin[x],x->Infinity]

MaxLimit[Sin[x],x->Infinity]

DiscreteMinLimit[(-1)^n,n->Infinity]

DiscreteMaxLimit[(-1)^n,n->Infinity]

Konvergence řad

Sum[1/n^n,{n,1,Infinity}] (* Tuto řadu Mathematica neumí sečíst *)

SumConvergence[1/n^n,n] (* Zjištění konvergence bez nalezení součtu *)

SumConvergence[x^n/n,n](* Zjištění konvergence v závislosti na parametru x *)

Taylorovy polynomy

Taylorův polynom funkce se zadaným středem a řádem:

tp=Series[Exp[x],{x,0,3}]

Chceme-li Taylorův polynom vykreslit nebo vyhodnotit v nějakém bodě, musíme se nejprve zbavit zbytku pomocí Normal:

Normal[tp]

Normal[tp] /. x->0.2

Exp[0.2]

Nacházi-li se konstrukce Normal[Series[...]] uvnitř Plot, je potřeba ji uzavřít do Evaluate.

Plot[Normal[Series[Exp[x],{x,0,3}]],{x,-5,5}]

Plot[Evaluate[Normal[Series[Exp[x],{x,0,3}]]],{x,-5,5}]

Extrémy

Globální extrémy

Minimize a Maximize hledají globální extrémy:

Plot[2x^2-3x+4,{x,-3,3}]

Minimize[2x^2-3x+4,x]

Maximize[2x^2-3x+4,x]

Extrém na zadaném intervalu:

Maximize[{2x^2-3x+4,-3≤x≤3},x]

Vždy je vrácen pouze jeden bod, ve kterém se nabývá extrému:

Minimize[Sin[x],x]

V některých případech je nutné hledat extrémy numericky (polynom vysokého stupně, Mathematica neumí přesně vypočítat nulové body derivace):

Minimize[x^8-5x^5+3x,x]

N[Minimize[x^8-5x^5+3x,x]]

Plot[x^8-5x^5+3x,{x,-2,2}]

Minimize a Maximize zvládají i extrémy funkcí více proměnných:

Minimize[x^2+6y^2-2x y+x+y,{x,y}]

Vázaný extrém:

Minimize[{2x+2y,x y==1,x>0,y>0},{x,y}] (* Nalezení obdélníku se stranami x, y tak, aby měl obsah 1 a minimální obvod *)

Lokální extrémy

Přesné polohy lokálních extrémů se někdy dají najít pomocí Solve[D[f[x],x]==0,x] (případně Reduce).

Plot[x^4-3x^2+2,{x,-2,2}]

Solve[D[x^4-3x^2+2,x]==0,x]

FindMaximum a FindMinimum numericky hledají lokální extrém poblíž zadaného bodu (vždy vrátí nejvýše jeden extrém):

Plot[Sin[x]/x,{x,0,15},PlotRange->All]

FindMaximum[Sin[x]/x,{x,8}]

FindMinimum[Sin[x]/x,{x,11}]

Diferenciální rovnice

Všechna řešení diferenciální rovnice:

DSolveValue[x'[t]==-t x[t]-t,x[t],t]

Řešení určené počáteční podmínkou:

reseni=DSolveValue[{x'[t]==-t x[t]-t,x[0]==1},x[t],t]

Vykreslení řešení:

Plot[reseni,{t,-5,5}]

Rovnice 2. řádu:

DSolveValue[{x''[t]==-x[t],x[0]==1,x'[0]==1},x[t],t]

Soustava rovnic:

DSolveValue[{x'[t]==x[t]+y[t],y'[t]==-5x[t]-y[t],x[0]==1,y[0]==0},{x[t],y[t]},t]