Here, we graph the 0-level set of the function F:(ℝ^3)⟶ℝ, F(x,y,z)=2x (y^2)+x y z-2(z^2)
and for two distinct points a=(2,-3,3)  and  b=(0,4,0) on this 0-level surface, we compute and graph the gradient vectors ∇F(a) and ∇F(b).  Then, at a, we see that one can use the Implicit Function Theorem to locally write the level surface as z=f(x,y), while at b, one cannot.  Finally, we compute the tangent spaces to the level surface at both points, showing that the tangent space at b is vertical.

(* A real-valed function on three space. *)
	F[x_,y_,z_]:=2x*y^2+x*y*z-2z^2;
(* Two points on teh 0-level surface of F.  *)
	a = {2,-3,3};
	b={0,4,0};
(* The 0-level surface as a subset of three space. *)
surface = ContourPlot3D[F[x,y,z]==0,{x,-10,10},{y,-10,10},{z,-10,10},AxesOrigin->{0,0,0},Boxed->False,Ticks->{{-5,5},{-4,4},{-3,3}},Mesh->None,ContourStyle->Opacity[0.8]];
(* Graphing the points on the surface and the gradient vector of F at these points.  *)
	apoint=Graphics3D[{PointSize[Large],Red,Point[a]}];
	bpoint = Graphics3D[{PointSize[Large],Red,Point[b]}];

	agradient = D[F[x,y,z],{{x,y,z}}] /. Thread[{x,y,z}->a];
	agradientvector = Graphics3D[{Blue,Thick,Arrow[{a,a+agradient/3}]}];
	bgradient = D[F[x,y,z],{{x,y,z}}] /. Thread[{x,y,z}->b];
	bgradientvector = Graphics3D[{Blue,Thick,Arrow[{b,b+bgradient/6}]}];
(*  Show everything we have so far. *)
	Show[surface,apoint,agradientvector,bpoint,bgradientvector]
(* Create the implicit function z = f[x,y] at point a but not at point b. *)
	U = ParametricPlot3D[{x,y,0},{x,1,3},{y,-4,-2}];
	Ub = ParametricPlot3D[{x,y,0},{x,-1,1},{y,2,4}];
	xyplane = ParametricPlot3D[{x,y,0},{x,-8,8},{y,-8,8},PlotStyle->Opacity[.5],Mesh->None];
(* Solve F[x,y,z] = 2x*y^2+x*y*z-2z^2 = 0 = (-2)z^2+(x*y)z + 2x*y^2. Note that this cannot be done at point b with x=z=0. *)
	f[x_,y_]:=(x*y+Sqrt[x^2*y^2+16*x*y^2])/4;
	graphU = ParametricPlot3D[{x,y,f[x,y]},{x,1,3},{y,-4,-2}];
(* Graph it all. *)
	Show[surface,apoint,agradientvector,U,graphU,Ub,bpoint,bgradientvector,xyplane]

(* Here are teh tangent planes at the two points a and b, using the gradient to produce them. *)atangentplane = ContourPlot3D[agradient.{x-a[[1]],y-a[[2]],z-a[[3]]}==0,{x,-10,10},{y,-10,10},{z,-10,10},ContourStyle->{Green,Opacity[.5]},Mesh->None];
	Show[surface,apoint,agradientvector,U,atangentplane]
btangentplane = ContourPlot3D[bgradient.{x-b[[1]],y-b[[2]],z-b[[3]]}==0,{x,-10,10},{y,-10,10},{z,-10,10},ContourStyle->{Green,Opacity[.5]},Mesh->None];
	Show[surface,bpoint,bgradientvector,Ub,btangentplane]