Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

Computation of the curvatures of Enneper's Minimal Surface

Views: 151
Kernel: SageMath 8.3

Enneper's Minimal Surface and its Curvatures

Let's consider a torus, parametrized as a surface of revolution and compute its different curvatures.

u,v = var('u v') x(u,v) = ( u-u^3/3+u*v^2, v - v^3/3 +v*u^2, u^2 - v^2 )

First Step, all the partial derivatives we'll need.

For all of our computations, we'll want the uu and vv partial derivatives of x(u,v)x(u,v) of order 1 and 2. So we compute them and store them in some variables.

xu = x.diff(u) xv = x.diff(v) xuu = x.diff(u,2) xuv = xu.diff(v) xvv = x.diff(v,2) show(xuv) # just as a check

First Fundamental Form

E = xu.dot_product(xu).simplify_full() F = xu.dot_product(xv).simplify_full() G = xv.dot_product(xv).simplify_full() I = matrix(SR, 2,2, [E,F, F, G]) show(I) # as a check

The Normal Vector

q = xu.cross_product(xv) size = q.norm().simplify_full().canonicalize_radical() show(size) # this should equal sqrt(EG-F^2), let's check
show(sqrt(E*G-F^2).canonicalize_radical()) # here is sqrt(EG-F^2)
n = (q(u,v)/size).simplify_full() show(n) # the unit normal vector
norm(n).simplify_full() # another check, just because things get brittle and I get worried.
1

The Second Fundamental Form

Now we have enough data to compute the second fundamental form. We don't have script letters here, so I'm gonna cheat.

ell = n.dot_product(xuu) em = n.dot_product(xuv) en = n.dot_product(xvv) II = matrix(SR, 2,2, [ell, em, em, en]).simplify_full() show(II)

The Shape Operator

Product = I.inverse()*II S = Product.simplify_full().canonicalize_radical() show(S)
# An aside... computers are bad at algebra, generally speaking. That crazy denominator is just ((u^2+v^2+1)^2).expand()
u^4 + 2*u^2*v^2 + v^4 + 2*u^2 + 2*v^2 + 1

Finally, curvatures

The Gaussian curvature is the determinant of the shape operator:

K = det(S) show(K)

The mean curvature is half the trace of the shape operator:

H = (1/2)*S.trace() show(H)

...and the principal curvatures are the eigenvaules of the shape operator. In this case, the matrix is diagonal, so these are easy to read off. But generally, one could use this command:

S.eigenvalues()
[-2/(u^4 + v^4 + 2*(u^2 + 1)*v^2 + 2*u^2 + 1), 2/(u^4 + v^4 + 2*(u^2 + 1)*v^2 + 2*u^2 + 1)]

and if for some reason that command won't work for you, you can always do it by hand:

p = S.characteristic_polynomial() show(p)
p.roots()
[(-2*sqrt((u^4 + 2*u^2*v^2 + v^4 + 2*u^2 + 2*v^2 + 1)^(-2)), 1), (2*sqrt((u^4 + 2*u^2*v^2 + v^4 + 2*u^2 + 2*v^2 + 1)^(-2)), 1)]
[elt[0].simplify_full().canonicalize_radical() for elt in p.roots()]
[-2/(u^4 + v^4 + 2*(u^2 + 1)*v^2 + 2*u^2 + 1), 2/(u^4 + v^4 + 2*(u^2 + 1)*v^2 + 2*u^2 + 1)]
cm = colormaps.autumn def my_color(u,v): return float((4 + K.subs(u=u,v=v))/4) Surface = parametric_plot3d(x(u,v), (u,-2,2),(v,-2,2) , color=(my_color,cm))
show(Surface, aspect_ratio=[1,1,1])