The Unit Normal to a Parametric Surface

Suppose that r ( u,v ) is a parametrization of a given surface.  Then r[u] ( u,v ) and r[v] ( u,v ) are tangent to the surface at the point r ( u,v ), and as a result, the cross product   r[u]   x   r[v]  is perpendicular to both r[u] ( u,v ) and r[v] ( u,v ).  Consequently, the cross product r[u]   x   r[v]  is perpendicular to the tangent plane, which implies r[u]   x   r[v]   is normal   to the surface r ( u,v ).  

[Maple OLE 2.0 Object]

The unit vector in the direction of r[u]   x   r[v]  is defined to be the unit surface normal.   That is, the unit surface normal to a parametric surface r ( u,v ) is given by

n = r[u]*x*r[v]/abs(abs(r[u]*x*r[v]))

Let's look at an example.

Example:  

Find the unit surface normal to r ( u,v ) = `<,>`(cosh(v)*cos(u),cosh(v)*sin(u),sinh(v))  for u  = 0..2 Pi  and for v  = -1..1.  

Solution: To begin with, let us define the surface as a Vector that can be manipulated with tools in the VectorCalculus package.

>    r:=Vector([cosh(v)*cos(u),cosh(v)*sin(u),sinh(v)]);

>   

Next, we must calculate the basis vectors   r[u] ( u,v ) and r[v] ( u,v ) and their cross product.  To do so, however, we use the VectorCalculus cross product command &x.  

>    r_u:=diff(r,u);
r_v:=diff(r,v);
ru_cross_rv:=r_u &x r_v;

>   

The unit normal is the unit vector in the direction of the cross product.  Hence, we must calculate the norm of the cross product and use it to produce a unit vector.  

>    n:=ru_cross_rv/sqrt(simplify(ru_cross_rv . ru_cross_rv));

>   

Let's illustrate by plotting a "field"

>    umin:=0:
umax:=2*Pi:
vmin:=-1:
vmax:=1:

ugrid:=15:  #Determines number of arrows used
vgrid:=5:  

#Calculate partition widths   
udelt:=evalf(abs(umax-umin)/ugrid,10):
vdelt:=evalf(abs(vmax-vmin)/vgrid,10):


#Commands to create normal field on surface
umin:=evalf(umin,10):umax:=evalf(umax,10):vmin:=evalf(vmin,10):vmax:=evalf(vmax,10):
p1:=plot3d(r,u=umin..umax,v=vmin..vmax):
iii:=0:
ppp:='ppp':
for unow from umin to umax by udelt do
   for vnow from vmin to vmax by vdelt do
      iii:=iii+1:
      curr_pt:=subs(u=unow,v=vnow,r):
      curr_vec:=subs(u=unow,v=vnow,n):
      #print(iii,curr_pt,curr_vec):
      ppp[iii]:=plots[arrow](curr_pt,curr_vec,color=green):
   end do:
end do:
ppp:=convert(ppp,'list'):
p2:=display(seq(ppp[iii],iii=1..nops(ppp)),insequence=false):
display(p1,p2,scaling=constrained);

>