Kapitola 15
Funkce zadaná implicitně v Maplu

V první části této kapitoly si všimneme problémů spojených s generováním PC-grafů funkce dané implicitně, v druhé pak použijeme Maplu při výpočtech derivací implicitně dané funkce.

15.1 Generování PC-grafu funkce zadané implicitně

Ke generování PC-grafu funkce dané implicitně používáme příkazů z knihovny plots: implicitplot a implicitplot3d. Pro ilustraci generujme PC-grafy křivky určené implicitně rovnicí x3 + y3 5xy + 15 = 0 (obr. 15.1 ) a plochy určené implicitně rovnicí coshz = ∘ ------- x2 + y2 (obr. 15.2 ).


 

PIC

obr. 15.1:
PIC
obr. 15.2:


> with(plots):


> implicitplot(x^3+y^3-5*x*y+1/5=0, x=-3..3, y=-3..3,
> grid=[50,50]);


> implicitplot3d(cosh(z)=sqrt(x^2+y^2),x=-3..3,y=-3..3,
> z=-2..2, grid=[15,15,20], style=patchcontour,
> orientation=[30,70]);

Při generování PC-grafů křivek daných implicitně při použití příkazu implicitplot není možno zaručit, že PC-graf bude odpovídat grafu křivky dané implicitně. Maple má při tvorbě PC-grafu „problémy“ s body [x,y], ležícími na křivce F( x,y) = 0, pro které je ∂F -∂x(x,y) = 0 a zároveň ∂F ∂y-(x,y) = 0. Typickým příkladem je křivka 2x4 + y4 3x2y 2y3 + y2 = 0 (obr. 15.3). Platí Fy = 4y3 3x2 6y2 + 2y, Fy(0,0) = 0, Fy(0,1) = 0 a Fx = 8x2 6xy, Fx(0,0) = 0, Fx(0,1) = 0. Ani zhuštění sítě v tomto případě nevede v okolí bodů [0,0] a [0,1] k uspokojivým výsledkům (obr. 15.4 ):
> implicitplot(2*x^4+y^4-3*x^2*y-2*y^3+y^2,
> x=-5/2..5/2, y=-5/2..5/2);


> implicitplot(2*x^4+y^4-3*x^2*y-2*y^3+y^2,
> x=-5/2..5/2, y=-5/2..5/2, grid=[100,100]);


 

PIC

obr. 15.3:
PIC
obr. 15.4:

V tomto případě je nejlepším řešením parametrizace zkoumané křivky:
> factor(subs(x=r*cos(phi), y=r*sin(phi),
> 2*x^4+y^4-3*x^2*y-2*y^3+y^2));

 ( ) r2 2 r2cos(φ )4 + r2sin(φ )4 − 3 rcos(φ )2 sin( φ) − 2rsin(φ )3 + sin(φ )2


> eqn:=op(2,");

 2 4 2 4 2 3 eqn := 2 r cos(φ ) + r sin(φ ) − 3r cos(φ) sin( φ)− 2rsin(φ ) + sin(φ )2

> sols:=map(simplify, {solve(eqn,r)},
> {sin(phi)^2+cos(phi)^2=1}, [cos(phi), sin(phi)]):


> sols:=map(unapply, sols, phi);

 { sols := 3 ∘ -----------6-----------4---------2 φ → −-sin(φ-)-+-3sin(φ-)−---−-11-sin(-φ)-+-10-sin(φ-)-+-sin(φ-) , 6 sin(∘φ-)4-−-8sin(φ-)2 +-4---------------- − sin(φ )3 + 3sin(φ )+ − 11 sin( φ)6 + 10 sin(φ )4 + sin(φ )2} φ → -------------------------4-----------2-------------------- 6 sin(φ ) − 8sin(φ ) + 4

> polarplot(sols, 0..2*Pi, view=[-5/2..5/2, 0..9/4],
> scaling=constrained, color=black, labels=[x,’y’]);

 

PIC

obr. 15.5:

Při pokusu o generování PC-grafu pro křivku určenou implicitně rovnicí 9x2 + 16y2 24xy 8y + 6x + 1 = 0 dostáváme prázdný PC-graf a ani zhuštění sítě opět nepomáhá. Pokusme se problém vyřešit jiným způsobem (obr. 15.6 ):
> Eq:= 9*x^2+16*y^2-24*x*y-8*y+6*x+1=0;

Eq := 9x2 + 16y2 − 24x y − 8y + 6x + 1 = 0


> student[completesquare](Eq, x );

 ( 4 1 )2 9 x− -y + -- = 0 3 3


> s:=solve( ", {y} );

 { } { } s := y = 3x + 1- , y = 3-x+ 1- 4 4 4 4


> assign(s);


> plot(y, x=-5..5, labels=[x,’y’]);


 

PIC

obr. 15.6:

Závěrem ukažme efekt změny přesnosti aproximativní aritmetiky a hustoty sítě na PC-graf pro křivku danou implicitně rovnicí 1 = -33xy3 x +y (obr. 15.7 15.9 ).
> eq:= 1=(3*x*y)/(x^3+y^3):


> implicitplot(eq,x=-4..4,y=-4..4);


Error, (in plot/iplot2d/levelcurve)
1st index, 1251, larger than upper array bound 1250


> Digits := 80:


> implicitplot(eq,x=-4..4,y=-4..4,grid=[30,30]);


> implicitplot(eq,x=-4..4,y=-4..4,grid=[40,40]);


> implicitplot(eq,x=-4..4,y=-4..4,grid=[50,50]);


 

PIC

obr. 15.7:
PIC
obr. 15.8:
PIC
obr. 15.9:

Z obrázků 15.7 15.9 je vidět, že algoritmus Maplu pro generování PC-grafu křivky dané implicitně není dostatečný pro generování PC-grafu odpovídajícího grafu takto zadané křivky.

15.2 Výpočty

Při výpočtu derivace funkce dané implicitně rovnicí F(x,y) = 0 pomocí počítačového systému používáme následujícího postupu. Rovnici F(x,y) = 0 derivujeme podle x a na y se díváme jako na funkci proměnné x. Pak dostáváme

Fx(x,y)+ y′Fy(x,y) = 0
a z této rovnice vypočteme y′. Stejný postup je vhodný i při výpočtu vyšších derivací. (Postačující podmínku pro existenci funkce zadané implicitně v okolí daného bodu křivky udává Věta 8.1 .)

Příklad 15.1. Určete rovnici tečny ke křivce dané rovnicí y3 xy = 6 v bodě [7,2].

> eqn:=y(x)^3-x*y(x)=-6;

 3 eqn := y(x ) − x y(x ) = − 6


> deqn:=diff(eqn,x);

 ( ) ( ) deqn := 3 y(x)2 -∂-y( x) − y(x )− x -∂-y(x ) = 0 ∂x ∂x


> dydx:=solve(deqn, diff(y(x), x));

 ---y(-x)--- dydx := 3 y(x)2 − x


> k:=eval(subs({y=2,x=7}, dydx));

 2- k := 5

Rovnice tečny t je y 2 = 2 5(x 7) tj. přímka 5y 2x + 4 = 0.
> p1:=plot(2/5*x-4/5, x=-10..10):


> p2:=implicitplot(eqn,x=-10..10,y=-4..4,grid=[50,50]):


> display({p1,p2});


 

PIC

obr. 15.10:

Poznámka 15.1. V novějších verzích Maplu (od verze R4) máme k dispozici proceduru implicitdiff, která počítá derivaci funkce dané implicitně rovnicí:
> dydx:=implicitdiff(y^3-x*y, y, x);

 y dydx := − −-3y2-+-x

Tato procedura je však vhodná spíše pro kontrolu získaných výsledků než pro vlastní procvičování derivování funkce dané implicitně.

 

Vhodným cvičením do počítačové laboratoře vyžadujícím jak znalost nezbytné teorie, tak základní znalost programování v Maplu je: napište proceduru, která určí derivaci funkce dané implicitně, případně její hodnotu v zadaném bodě:
> implicitdiff := proc(g)
> local tmp,DIFFg,DIFFy,DIFFy0,p1:
> DIFFg:= diff(g,x):
> DIFFy:=
> simplify(solve(subs(diff(y(x),x)=p1,DIFFg)=0,p1));
> end:


> implicitdiff(y(x)^3-x*y(x)+6);

 y( x) − -------2----- − 3 y(x) + x


> implicitdiffb := proc(x0,y0,g)
>  local tmp,DIFFg,DIFFy,DIFFy0,p1:
>  tmp:=subs(y(x)=y0,g):
>  if (simplify(subs(x=x0,tmp)) <> 0) then
>   ERROR(‘ x0,y0 appear not to be on the curve‘):
>  fi:
>  DIFFg:= diff(g,x):
>  DIFFy:=simplify(solve(subs(diff(y(x),x)=
>  p1,DIFFg)=0,p1)):
>  DIFFy0:= simplify(subs(x=x0,y(x0)=y0,DIFFy)):
>  DIFFy0
>  end:


> implicitdiffb(7,2,y(x)^3-x*y(x)+6);

2- 5

Výstupem další uvedené procedury je přímo rovnice tečny ke křivce dané implicitně v daném bodě a PC-graf (obr. 15.11 ):
> graf_t:=proc() local a,b,c,u,v,k;
>  a:=diff(args[1],x);
>  b:=diff(args[1],y);
>  u:=op(1,args[2]);
>  v:=op(2,args[2]);
>  c:=eval(subs({x=u,y=v},args[1]));
>  if c=0 then
>  k:=(subs({x=u,y=v},a)*(x-u)+subs({x=u,y=v},b)*
>    (y-v));
>  print(‘Rovnice tečny v~bodě‘,args[2],‘je ‘,k=0);
>  if nargs(graf_t)=6 then
>  RETURN (plots[implicitplot]({args[1],k},
>  x=args[3]..args[4],y=args[5]..args[6]));
>  fi;
>  fi;
>  if c<>0 then
>  print(‘Bod‘,args[2],‘neleží na křivce ‘,args[1]=0);
>  fi;
>  end;
>


> graf_t(y^3-x*y+6, [7, 2], -10,10,-4,4 );

Rovnice tecny v bode,[7,2],je,− 2x + 4+ 5 y = 0

 


 

PIC

obr. 15.11:


> graf_t(y^3-x*y+6, [1, 1]);

Bod, [1,1],nelezi nakrivce ,y3 − x y + 6 = 0

 

Příklad 15.2. Rozhodněte, zda křivka x3 + y3 2xy = 0 leží v okolí bodu [1,1] pod tečnou nebo nad tečnou.


> alias(y=y(x));

I,y


> eq:=x^3+y^3-2*x*y=0;

eq := x3 + y3 − 2x y = 0

Derivujme rovnici x3 + y3 2xy = 0 podle x za předpokladu, že y je funkce proměnné x:
> diff(eq,x);

 ( ∂ ) ( ∂ ) 3x2 + 3y2 ---y − 2y − 2x ---y = 0 ∂x ∂x


> dydx:=solve(", diff(y,x));

 3 x2 − 2 y dydx := − ---2----- 3 y − 2 x

Dalším derivováním podle x obdržíme:
> diff(eq, x$2);

 ( )2 ( 2 ) ( ) ( 2 ) 6 x+ 6 y -∂-y + 3 y2 -∂--y − 4 ∂--y − 2x -∂--y = 0 ∂x ∂x2 ∂x ∂x2


> solve(", diff(y,x$2));

 (∂- )2 ( ∂- ) − 6-x+-6-y--∂x y--−-4--∂x y 3 y2 − 2 x


> d2ydx2:=normal(subs(diff(y,x)=dydx, "));

 y-x(27-y3 −-54-xy-+-27-x3 +-8-) d2ydx2 := 2 (− 3 y2 + 2 x)3

Dosazením dostaneme:
> subs({x=1,y=1}, d2ydx2);

− 16

což znamená, že křivka leží v okolí bodu [1,1] pod tečnou.

Analogicky postupujeme v případě implicitně zadané funkce více proměnných.

Příklad 15.3. Určete rovnici tečné roviny v bodě [1,0,1] k ploše určené rovnicí x3 + y3 + z3 3xyz x y z = 0.
Derivujme danou rovnici podle x a podle y, přičemž z chápeme jakožto funkci proměnných x a y.
> alias(z=z(x,y)):


> rov:=x^3+y^3+z^3-3*x*y*z-x-y-z=0;

rov := x3 + y3 + z3 − 3x yz − x− y − z = 0


> diff(rov, x);

 ( ∂ ) ( ∂ ) ( ∂ ) 3x2 + 3z2 ---z − 3y z − 3 xy ---z − 1− ---z = 0 ∂x ∂x ∂x


> dzdx:=solve(", diff(z,x));

 2 dzdx := − 3x--−-3y-z −-1 3z2 − 3x y − 1


> diff(rov,y);

 ( ) ( ) ( ) 3y2 + 3z2 ∂--z − 3x z − 3 xy ∂--z − 1− -∂-z = 0 ∂y ∂y ∂y


> dzdy:=solve(", diff(z,y));

 3y2 − 3x z − 1 dzdy := − 3z2-−-3x-y −-1

Dosazením x = 1, y = 0 a z = 1 dostáváme:
> subs({x=1,y=0,z=1}, dzdx);

− 1


> subs({x=1,y=0,z=1}, dzdy);

2

Platí zx(1,0) = 1, zy(1,0) = 2 a tedy tečná rovina k dané ploše v bodě [1,0,1] má rovnici z 1 = (x 1) + 2y, po úpravě x 2y + z 2 = 0.

 

Příklad 15.4. Určete lokální extrémy funkce z = f(x,y) určené implicitně rovnicí

 √ -- F (x,y,z) = x2 + y2 + z2 − xz − 2yz = 1.

> alias(z=z(x,y)):


> F:=x^2+y^2+z^2-x*z-sqrt(2)*y*z=1;

F := x2 + y2 + z2 − xz − √2-yz = 1

Derivováním zadávající rovnosti podle x a y dostáváme:
> diff(F,x);

 ( ) ( ) √ -- ( ) 2x + 2z ∂--z − z − x -∂-z − 2 y -∂-z = 0 ∂x ∂x ∂x


> dzdx:=solve(", diff(z,x));

dzdx := − ---2-x-−-z√--- 2z − x − 2y


> diff(F,y);

 ( ) ( ) ( ) -∂- -∂- √ -- √ -- ∂-- 2 y + 2z ∂y z − x ∂y z − 2z − 2y ∂y z = 0


> dzdy:=solve(", diff(z,y));

 √ -- 2y − 2z dzdy := − ---------√--- 2z − x − 2y

Stacionární body určíme z podmínky zx = 0 = zy:
> s:=solve({dzdx=0, dzdy=0, F},{x,y,z});

 { √-} { √ -} s := x = 1,z = 2,y = 2 , x = − 1,z = − 2,y = − 2

Vypočtěme dále parciální derivace 2. řádu ve stacionárních bodech:
> diff(F,x,x);

 ( )2 ( ) ( ) ( ) ∂-- ∂2-- -∂- -∂2- 2+ 2 ∂x z + 2z ∂x2 z − 2 ∂x z − x ∂x2 z − √-- ( ∂2 ) 2 y ---2 z = 0 ∂x

> dzdxx:=solve (", diff(z,x,x));
 ( )2 ( ) 2-+-2--∂∂x z--−-2--∂∂x z dzdxx := − 2z − x− √2--y


> zxxP:=subs(diff(z,x)=0, dzdxx);

 1 zxxP := − 2---------√--- 2z − x − 2 y


> diff(F,y,y);

 ( ) ( ) ( ) ( ) ∂-- 2 ∂2-- -∂2- √-- ∂-- 2+ 2 ∂y z + 2z ∂y2 z − x ∂y2 z − 2 2 ∂y z − √-- ( 2 ) 2 y -∂--z = 0 ∂y2

> dzdyy:=solve (", diff(z,y,y));
 ( ∂- )2 √ --(-∂ ) 2-+-2--∂y z--−-2--2--∂y-z- dzdyy := − 2z − x− √2-y


> zyyP:=subs(diff(z,y)=0, dzdyy);

zyyP := − 2------1--√--- 2z − x − 2 y


> diff(F,x,y);

 ( ∂ ) ( ∂ ) ( ∂2 ) ( ∂ ) ( ∂2 ) 2 ---z ---z + 2 z ------z − ---z − x ------z ∂y ∂x ∂y ∂x ( ∂y ) ∂y(∂x ) √-- ∂-- √ -- -∂2--- − 2 ∂x z − 2y ∂y∂x z = 0

> dzdxy:=solve (", diff(z,x,y));
 ( ) ( ) ( ) √ --( ) 2 ∂∂y z ∂∂x z − ∂∂y z − 2 ∂∂x z dzdxy := − -------------------√--------------- 2z − x− 2 y


> zxyP:=subs({diff(z,y)=0,diff(z,x)=0},  dzdxy);

zxyP := 0

Určeme hodnotu Δ = zxxzyy zxy2 ve stacionárních bodech:
> Delta:=zxxP*zyyP-(zxyP)^2;

 1 Δ := 4 (---------√---)2 2z − x − 2 y


> subs(s[1], Delta);subs(s[1], zxxP);

4

 

− 2


> subs(s[2], Delta);subs(s[2], zxxP);

4

 

2

Protože v obou bodech je Δ = 4 > 0, nastávají v těchto bodech lokální extrémy, a to maximum v bodě [1, -- √ 2,2] (neboť zxx = 2) a minimum v bodě [1,√2-,2] (zxx = 2).