A surface of revolution can be created by rotating a planar generator curve around an axis lying in the same plane as the curve. Chebfun has a command `cylinder`

for such calculations, which takes a chebfun as input and produces a Chebfun2 as output. A classical example is the unit sphere, which can be obtained by rotating $\sqrt{1-x^2}$ defined on $[-1,1]$ around the $x$-axis. Here we have to rotate $\sqrt{1.0001-x^2}$ because Chebfun2 cannot represent functions with square root singularities.

x = chebfun('x'); f = sqrt(1.0001-x.^2); plot(f,'linewidth',1.6), axis equal snapnow cylinder(f), axis equal

An even simpler example is a cone, which is constructed by rotating a linear polynomial around an axis.

In the `cylinder`

command, the input chebfun defines the radius along the unit height of the cylinder. Omitting output arguments causes the cylinder to be displayed with a `surf`

command and no outputs to be returned. For the cone example, we can proceed as follows:

f = chebfun(@(x) -3*x + 3); cylinder(f)

By default the surface of revolution has height $1$ and is displayed as if the generator curve was rotated around the $z$-axis. We can get the $(x,y,z)$-coordinates, stretch the $z$-coordinates to match the interval of definition of the generator chebfun, and rearrange the coordinates so that the generator chebfun is rotated around the $x$-axis:

f = chebfun(@(x) 2.8*sin(0.2*x - 0.1) + 6.3, [-5 35]); ends = f.ends; [xx, yy, zz] = cylinder(f); zzstr = diff(ends)*zz + ends(1); surf(zzstr,flipud(yy),xx)

Let us create yet another surface and study some of its properties within Chebfun.

x = chebfun('x', [0 2*pi]); f = sqrt(4 + 2*sin(2*x)); [xx, yy, zz] = cylinder(f); surf(xx,yy,zz) zlim([0 8])

The volume of this object can be computed as

$$ V = \pi \int_a^b f^2(x)\, \mathrm{d}x. $$

This is a basic computation in Chebfun and we compare the result with the exact value:

V = pi*sum(f.^2) error = V - 8*pi^2

V = 78.956835208714836 error = -2.842170943040401e-14

The area of the surface is given by

$$ A = 2\pi \int_a^b f(x)\sqrt{1+|f'(x)|^2}\, \mathrm{d}x. $$

A = 2*pi*sum(f.*sqrt(1 + abs(diff(f)).^2))

A = 95.016245402718411

The coordinates of the center of gravity are $x_G=0$, $y_G=0$, and

$$ z_G = \frac{\pi}{V} \int_a^b x f^2(x)\, \mathrm{d}x. $$

zG = pi/V*sum(x.*f.^2) hold on colormap hsv, alpha(.1) plot3(0,0,zG,'.r','MarkerSize',40) zlim([0 8]) hold off

zG = 2.891592653589793

Finally we compute the moment of inertia, assuming that the object is homogeneous with density $1$,

$$ J = \frac{\pi}{2} \int_a^b f^4(x)\, \mathrm{d}x. $$

J = pi/2*sum(f.^4)

J = 1.776528792196084e+02

And a last one:

fls = chebfun('1./(1+8*x.^2)'); [xx, yy, zz] = cylinder(fls); surf(xx,yy,zz/4) axis equal hold on h = findobj('type', 'axes'); set(h(1), 'visible', 'off') colormap(gray) view(0,10) theta = (0:12)/12*2*pi; plot3(cos(theta),sin(theta),.01*ones(size(theta)),'g.') plot3(fls(.4)/2*cos(theta),fls(.4)/2*sin(theta),.17*ones(size(theta)),'r.') plot3(fls(.4)/2*cos(theta),fls(.4)/2*sin(theta),-.17*ones(size(theta)),'y.')