Pro práci s funkcemi dvou proměnných musíme deklarovat proměnné $x$ a $y$.
{{{id=5| (x,y,z)=var('x y z') /// }}}Nadefinujeme funkci dvou proměnných, pomocí příkazu show si ji zobrazíme a pomocí příkazu diff ji zderivujeme, v tom to případě jednou podle $x$ a jednou podle $y$, tj vypočteme $f''_{xy}$.
{{{id=7| f(x,y)=atan(y/x) show(f(x,y)) diff(f(x,y),x,y) /// \newcommand{\Bold}[1]{\mathbf{#1}}\arctan\left(\frac{y}{x}\right) \newcommand{\Bold}[1]{\mathbf{#1}}-\frac{1}{{\left(\frac{y^{2}}{x^{2}} + 1\right)} x^{2}} + 2 \, \frac{y^{2}}{{\left(\frac{y^{2}}{x^{2}} + 1\right)}^{2} x^{4}} }}}Výsledek nic moc? Tak si jej upravíme. Znak _ nás odkazuje na výsledek posledního výpočtu a funkce factor se snaží výraz rozložit na součin.
{{{id=28| factor(_) /// \newcommand{\Bold}[1]{\mathbf{#1}}-\frac{{\left(x - y\right)} {\left(x + y\right)}}{{\left(x^{2} + y^{2}\right)}^{2}} }}}Definujeme jinou funkci dvou proměnných: $f(x,y)=xy(4-x-y)$.
Derivace funkce položíme rovny nule a najdeme tak stacionární body. Potom všechny stacionární body dosadíme do Hessiánu a druhé parciální derivace podle $x$.
{{{id=11| f(x,y)=x*y*(4-x-y) show(z==f(x,y)) sols=solve([diff(f(x,y),x),diff(f(x,y),y)],[x,y], solution_dict=True) fxx(x,y)=diff(f(x,y),x,x) H=f.hessian().determinant() A=[["Stacionární bod","Hesián","$f''_{xx}$"]] for s in sols: A.append([[s[x],s[y]],H(s[x],s[y]),fxx(s[x],s[y])]) html.table(A,header=True) /// \newcommand{\Bold}[1]{\mathbf{#1}}z = -{\left(x + y - 4\right)} x yStacionární bod | Hesián | f''_{xx} |
---|---|---|
\left[0, 0\right] | -16 | 0 |
\left[0, 4\right] | -16 | -8 |
\left[4, 0\right] | -16 | 0 |
\left[\frac{4}{3}, \frac{4}{3}\right] | \frac{16}{3} | -\frac{8}{3} |
Nyní se můžeme pokusit tento postup co nejvíce zautomatizovat a napsat funkci, která se snaží nalézt všechny lokální extrémy a posoudit jejich kvalitu.
{{{id=31| x,y=var('x y') def loc_extr(funkce): html(r'Funkce $z=%s$'%latex(funkce)) sols=solve([diff(funkce,x),diff(funkce,y)],[x,y], solution_dict=True) fxx=diff(funkce,x,x) H=funkce.hessian().determinant() A=[["Stacionární bod","Hesián","$f''_{xx}$","rozhodnutí"]] for s in sols: if H.subs(s) < 0: druha_derivace='...' rozhodnuti='sedlo' elif H.subs(s) > 0: druha_derivace=fxx.subs(s) if fxx.subs(s) > 0: rozhodnuti='minimum' else: rozhodnuti='maximum' else: druha_derivace='...' rozhodnuti='???' A.append([[s[x],s[y]],H.subs(s),druha_derivace,rozhodnuti]) html.table(A,header=True) /// }}} {{{id=32| loc_extr(x*y*(4-x-y)) /// Funkce z=-{\left(x + y - 4\right)} x yStacionární bod | Hesián | f''_{xx} | rozhodnutí |
---|---|---|---|
\left[0, 0\right] | -16 | ... | sedlo |
\left[0, 4\right] | -16 | ... | sedlo |
\left[4, 0\right] | -16 | ... | sedlo |
\left[\frac{4}{3}, \frac{4}{3}\right] | \frac{16}{3} | -\frac{8}{3} | maximum |
Stacionární bod | Hesián | f''_{xx} | rozhodnutí |
---|---|---|---|
\left[0, 0\right] | -4 | ... | sedlo |
Graf funkce dvou proměnných. Pomocí myši můžete grafem otáčet a kolečkem přibližovat a oddalovat (musíte smazat volbu viewer='tachyon', která je použita pro zobrazení statického obrázku).
{{{id=17| plot3d(f(x,y),(x,-5,5),(y,-5,5),viewer='tachyon') /// }}}Graf funkce dvou proměnných se stacionárními body. Posloupnost příkazů vytiskne funkci, stacionární body a nakreslí tyto body do 3D grafu
{{{id=23| x,y,z=var('x y z') f(x,y)=x*y*(4-x-y) show(z==f(x,y)) sols=solve([diff(f(x,y),x),diff(f(x,y),y)],[x,y], solution_dict=True) PIC=plot3d(f(x,y),(x,-8,8),(y,-8,8),opacity=0.8) SP=[] for s in sols: SP.append([s[x],s[y]]) PIC=PIC+point3d((s[x],s[y],f(s[x],s[y])),color='red') show(SP) show(PIC,viewer='tachyon') PIC.rotate((0,0,1),pi/3).show(viewer='tachyon') /// \newcommand{\Bold}[1]{\mathbf{#1}}z = -{\left(x + y - 4\right)} x y \newcommand{\Bold}[1]{\mathbf{#1}}\left[\left[0, 0\right], \left[0, 4\right], \left[4, 0\right], \left[\frac{4}{3}, \frac{4}{3}\right]\right] }}}Pro kreslení vrstevnic slouží příkaz contour_plot, který je popsán v dalším dokumentu.
{{{id=29| /// }}}