This example shows Chebfun2 being used to represent parameterized surfaces. We start by plotting two simple quadratic surfaces that are commonly taught in multivariate calculus: a cone and a hyperboloid of one sheet.
These two surfaces can be parameterized using polar coordinates. We first define the radial and angular parameters as Chebfun2 objects.
u = chebfun2(@(u,v) u, [-1 1 0 2*pi]); v = chebfun2(@(u,v) v, [-1 1 0 2*pi]);
Here we plot a cone.
x = u.*cos(v); y = u.*sin(v); z = u; surf(x,y,z), axis equal
And here we graph a hyperboloid of one sheet.
x = sqrt(1/4+u.^2).*cos(v); y = sqrt(1/4+u.^2).*sin(v); z = u; surf(x,y,z), axis equal
We can also define functions over such surfaces. Here is one example:
f = (1-u).*sin(10*v); surf(x,y,z,f), axis equal
We now generate a bumpy sphere. We start with a parameterization based on standard spherical coordinates.
t = chebfun2(@(t,p) t,[0 2*pi -pi/2 pi/2]); p = chebfun2(@(t,p) p,[0 2*pi -pi/2 pi/2]); [x,y,z] = sph2cart(t,p,0*t+1); surf(x,y,z), axis equal
To make it bumpy, we perturb its radius with an oscillatory function.
delta = sin(20*x)+sin(20*y)+sin(20*z); [x,y,z] = sph2cart(t,p,1+0.05*delta); surf(x,y,z), axis equal tight
Finally we define a function on its surface.
f = (sin(10*t)).*cos(15*p); surf(x,y,z,f), axis equal tight
Here is the top view:
view(0,90)
There are many other interesting surfaces that can be represented by Chebfun2 objects. The parameterization of this seashell was taken from [1].
u = chebfun2(@(u,v) u, [0 6*pi 0 2*pi]); v = chebfun2(@(u,v) v, [0 6*pi 0 2*pi]); x = 2*(1-exp(u/(6*pi))).*cos(u).*cos(v/2).^2; y = 2*(-1+exp(u/(6*pi))).*sin(u).*cos(v/2).^2; z = 1-exp(u/(3*pi))-sin(v)+exp(u/(6*pi)).*sin(v); surf(x,y,z), camlight view(160,10), axis equal, box on
Here is the top view:
view(-180,90)
And here is the well known Moebius strip, see [2], often used as an example of a non-orientable surface.
u = chebfun2(@(u,v) u, [0 2*pi -1 1]); v = chebfun2(@(u,v) v, [0 2*pi -1 1]); x = (1+0.5*v.*cos(u/2)).*cos(u); y = (1+0.5*v.*cos(u/2)).*sin(u); z = 0.5*v.*sin(u/2); surf(x,y,z), camlight, axis equal, box on
What happens if we try to plot normal vectors to this surface? We can compute a normal vector field to this surface using the command NORMAL, which take a position vector as input.
r = [x;y;z]; n = normal(r); hold on, quiver3(x,y,z,n,2,'k','numpts',8) axis tight
The normal, as computed, is clearly not continuous on this surface. The normal vector field computed above is $ru$ x $rv$. Both $ru$ and $rv$ are parallel to the surface. We illustrate this below
ru = diff(r,1,1); rv = diff(r,1,2); quiver3(x,y,z,ru,'r','numpts',8) quiver3(x,y,z,rv,'b','numpts',8) view(-80,65); hold off
We can verify that $ru$ and $rv$ are orthogonal, in this case, by taking their inner product.
norm(ru'*rv,inf)
ans = 5.016985192747734e-14
Finally, we take advantage of this orthogonality and project an arbitrary vector field $V$ onto the Moebius surface. In the figure below, the field PV
is tangent to the surface.
R1 = ru/sqrt(ru'*ru); R2 = rv/sqrt(rv'*rv); V = [sin(5*u);cos(5*v);0]; PV = (R1'*V)*R1 + (R2'*V)*R2; surf(x,y,z), axis tight, view(-80,65), camlight hold on quiver3(x,y,z,PV,2,'k','numpts',30) hold off
Our final example is the Klein Bottle, see [3], which is also non-orientable. A plot of the "figure 8" immersion (Klein bagel) of the Klein bottle is below.
u = chebfun2(@(u,v) u, [0 2*pi 0 2*pi]); v = chebfun2(@(u,v) v, [0 2*pi 0 2*pi]); r = 3; x=(r+cos(u/2).*sin(v)-sin(u/2).*sin(2*v)).*cos(u); y=(r+cos(u/2).*sin(v)-sin(u/2).*sin(2*v)).*sin(u); z=sin(u/2).*sin(v)+cos(u/2).*sin(2*v); surf(x,y,z,'FaceAlpha',.6), camlight left, colormap(hot), axis tight equal off
And here are the top and side views.
view(0,90)
view(90,0)
Here is the more complicated version found by Robert Israel of the parameterization of the 3-dimensional immersion of the bottle itself.
u = chebfun2(@(u,v) u, [0 pi 0 2*pi]); v = chebfun2(@(u,v) v, [0 pi 0 2*pi]); x = -(2/15)*cos(u).*(3*cos(v)-30*sin(u)+90*cos(u).^4.*sin(u)- ... 60*cos(u).^6.*sin(u)+5*cos(u).*cos(v).*sin(u)); y = -(1/15)*sin(u).*(3*cos(v)-3*cos(u).^2.*cos(v)-48*cos(u).^4.*cos(v)+ ... 48*cos(u).^6.*cos(v)-60*sin(u)+5*cos(u).*cos(v).*sin(u) ... -5*cos(u).^3.*cos(v).*sin(u) -80*cos(u).^5.*cos(v).*sin(u)+ ... 80*cos(u).^7.*cos(v).*sin(u)); z = (2/15)*(3+5*cos(u).*sin(u)).*sin(v); surf(x,y,z,'FaceAlpha',.5), camlight left, axis tight equal off
A normal vector field on this surface can now be obtained using Chebfun2 with a simple command.
hold on quiver3(x,y,z,-normal([x;y;z]),2,'k') hold off