L6-Curvature.mws

Calculus IV with Maple
Copyright 2002, Dr. Jack Wagner
j.wagner@intelligentsearch.com

Lesson 6: Curvature

Topics:   Normal curvature, Gaussian curvature, second fundamental form, Dupin Indicatrix ,
Maple commands introduced : PrincipalNormal, BilinearForm, Curvature

Normal Curvature

Consider a surface, F(u,v) = [u, v, u^2-v^2]  in which we embed the image of the curve h(t) = [t, cos(t)] .

>    restart: with(VectorCalculus): with(LinearAlgebra):with(plots):

>    F := <u, v, u^2-v^2>;

F := Vector(%id = 20951416)

>    plot3d(F, u=-2..2, v=-2..2, axes=normal, color=aquamarine, style=wireframe);

[Maple Plot]

>    P := <t, cos(t), 0>;

P := Vector(%id = 21194208)

>    C := eval(F, {u=t, v=cos(t)});

C := Vector(%id = 21318496)

>    P0 := spacecurve(evalm(P), t=-2..2, color=blue, thickness=2):

>    P1 := plot3d(F, u=-2..2, v=-2..2, axes=normal, color=aquamarine, style=wireframe):

>    P2 := spacecurve(evalm(C), t=-2..2, color=red, thickness=2):

>    display(P0, P1, P2);

[Maple Plot]

Now define a map, N(u,v) = F[u]*x*F[v]/abs(F[u]*x*F[v])  . This is the unit normal to the surface and is a map to the unit sphere. Restricted to C it is a curve embedded in the surface of the unit sphere.

     

>    dF[u] := diff(F, u);

dF[u] := Vector(%id = 20829424)

>    dF[v] := diff(F, v);

dF[v] := Vector(%id = 21758160)

>    nn :=  (dF[u] &x dF[v]);

nn := Vector(%id = 21196888)

>    N := Normalize(nn, 2, inplace):

>    N := simplify(N) assuming real;

N := Vector(%id = 20272448)

>    Nt := eval(N, {u=t, v=cos(t)});

Nt := Vector(%id = 21099436)

The normal vector N(u,v) shown as a parametrized surface over u and v.

>    P3 := plot3d(N, u=-2..2, v=-2..2, color=aquamarine, axes=normal, style=wireframe, scaling=constrained, numpoints=2000):

>    P4 := spacecurve(evalm(Nt), t=-2..2, axes=normal, color=red, thickness=2, style=wireframe):

>    display(P3, P4);

[Maple Plot]

>    dC := diff(C, t);

dC := Vector(%id = 22179352)

>    dC0 := eval(dC, t=0); #The tangent to C at t=0

dC0 := Vector(%id = 20329152)

>    C0 := eval(C, t=0);

C0 := Vector(%id = 20329032)

>    P5 := spacecurve(evalm(C0+s*dC0), s=-1..1, color=blue, thickness=3):

>    display(P1, P2, P5);

[Maple Plot]

The differential of the map N, dN, is a map from the tangent space of the F(u, v) surface to the tangent space of the unit sphere.  Since N.N=1 -> N'.N = 0, dN lives in the tangent space. dN = N[u]*du  + N[v]*dv  

>    JN := Jacobian(N, [u, v, w]):

Let dNt be the map dN restricted to the curve C(t) = F(P(t)). dNt = N(C(t))' = N'(C(t))C'(t). This is the tangent to the image of the curve C(t) on the unit sphere.

>    JNt := simplify( eval(JN, {u=t, v=cos(t)}) );

JNt := Matrix(%id = 20632900)

>    dP := diff(P, t);

dP := Vector(%id = 2642620)

>    JNt0 := eval(JNt, t=0);

JNt0 := Matrix(%id = 2759156)

>    Tt := simplify(JNt.dP);

Tt := Vector(%id = 2643020)

Evaluating at t=0; The image of the tangent to C at t=0.

>     Tt0 := eval(Tt, t=0);

Tt0 := Vector(%id = 3022592)

At the point N(0, 1) corresponding to t=0, the image of dC0 under the map dNt  is the tangent to the image of C under the map N.

>    N0 := eval(Nt, t=0);

N0 := Vector(%id = 3022632)

>    P6 := spacecurve(evalm(N0+s*Tt0), s=-1/2..1/2, color=blue, thickness=2):

>    display(P3, P4, P6);

[Maple Plot]

Now consider the principal normal vector  to the embedded curve C.

PrincipalNormal

>    n := simplify( PrincipalNormal(C, t) );

n := Vector(%id = 18768648)
n := Vector(%id = 18768648)
n := Vector(%id = 18768648)

>    n0 := eval(n, t=0);

n0 := Vector(%id = 18896796)

Note that the principal normal, n, is not   a unit vector. n = kappa   n , where n  is the unit normal.

>    P7 := spacecurve({evalm(C0+s*Tt0), evalm(C0+3*s*N0), evalm(C0+s*n0)}, s=-1..1, color=blue, thickness=3):

>    display(P1, P2, P7);

[Maple Plot]

Define the normal curvature as the projection of n onto N.

>    kappa['n'] := N0.n0;

kappa[n] := 2/5*5^(1/2)

Because N is a unit vector, <N, n> = <N, kappa n > = kappa  cos(N, n ), where kappa  is the usual curvature.  

Curvature

>    k := eval(Curvature(C, t), t=0);

k := 1/2*68^(1/2)

>    cos(theta) := N0.Normalize(n0, 2);

cos(theta) := 2/85*5^(1/2)*17^(1/2)

>    simplify(k*cos(theta));

2/5*5^(1/2)

Second Fundamental Form

We now define a bilinear form   II[p](tau) . Set dN = JNt. Let x (s) =   [u(s), v(s)]  be a curve in the surface F(u, v), parametrized by arc length. Let tau (s)  be the unit tangent at s. Define:   II[p] ( tau (s)) =   -   <dN ( tau (s)), tau (s)   >      II[p] ( tau (s)) is called the second fundamental form of F at p. We will work at the point p  = x (0). Let N( x (s)) be the restriction of N to x (s).

Since N( x (0)) is normal to the tangent   x' (0) we have <N( x (0)), x' (0)>=0.

<N'( x (0). x' (0), x' (0)> + <N, x'' (0)> = 0 -> <N'( x (0)). x' (0), x' (0)> = - <N, x'' (0)> = kappa[n]

Implementing this in Maple:

 

>    II[p] := JNt0;

II[p] := Matrix(%id = 2759156)

>    u := t: v := cos(t):

>    du := diff(u, t); dv := diff(v, t);

du := 1

dv := -sin(t)

>    dx := <du, dv, 0>;

dx := Vector(%id = 23125360)

Note that at t=0 this is a unit  tangent vector.   

BilinearForm

>    B := -BilinearForm(dx, dx, JNt0);

B := 2/5*5^(1/2)-2/25*sin(conjugate(t))*5^(1/2)*sin(t)

>    Bt0 := eval(B, t=0);

Bt0 := 2/5*5^(1/2)

Expand II[p] ( tau(s) ) =   -   <dN ( tau(s) ), tau(s)   > = -   (   N[u]*du+N[v]*dv ).( x[u]*du  + x[v]*dv ) = - `<,>`(N[u],x[u])*du^2   -   `<,>`(N[v],x[u])*du*dv   - `<,>`(N[u],x[v])*du*dv   -   `<,>`(N[v],x[v])*dv^2 .   

Since N  is orthogonal to the tangent plane,   `<,>`(N,x[u])  = 0 -> `<,>`(N[u],x[u])  = - `<,>`(N,x[uu])  ->

II[p] ( tau(s) ) = `<,>`(N,x[uu])*du^2  +2 `<,>`(N,x[uv])*du*dv  + `<,>`(N,x[vv])*dv^2  

Set L= `<,>`(N,x[uu])  , M = `<,>`(N,x[uv])  , N = `<,>`(N,x[vv])   The second fundamental form may then be expressed as:

II[p] ( tau(s) ) = L du^2  + 2M du*dv  + N dv^2  

>    restart: with(VectorCalculus): with(LinearAlgebra):with(plots):

>    F := <u, v, u^2-v^2>;

F := Vector(%id = 22228232)

>    dF[u] := diff(F, u); dF[v] := diff(F, v);

dF[u] := Vector(%id = 22228432)

dF[v] := Vector(%id = 22229112)

>    n := dF[u] &x dF[v];

n := Vector(%id = 22594904)

>    NN := Normalize(n, 2, inplace):

>    NN := simplify(NN) assuming real;

NN := Vector(%id = 2627140)

>    dF[uu] := diff(dF[u], u);

dF[uu] := Vector(%id = 2627260)

>    dF[uv] := diff(dF[u], v);

dF[uv] := Vector(%id = 2627300)

>    dF[vv] := diff(dF[v], v);

dF[vv] := Vector(%id = 2627340)

>    L := NN.dF[uu];

L := 2/(1+4*u^2+4*v^2)^(1/2)

>    M := NN.dF[uv];

M := 0

>    N := NN.dF[vv];

N := -2/(1+4*u^2+4*v^2)^(1/2)

>    u := t: v := cos(t):

>    du := diff(u, t); dv := diff(v, t);

du := 1

dv := -sin(t)

>    II[p] := L*(du)^2+M*du*dv+N*(dv)^2;

II[p] := 2/(1+4*t^2+4*cos(t)^2)^(1/2)-2/(1+4*t^2+4*cos(t)^2)^(1/2)*sin(t)^2

>    eval(II[p], t=0);

2/5*5^(1/2)

>    restart:with(plots): with(VectorCalculus): with(LinearAlgebra):

The maximum and minimum curvatures are the eigenvalues of dN.  

>    F := <u, v, u^2-v^2>;

F := Vector(%id = 18807024)

>    dF[u] := diff(F, u); dF[v] := diff(F, v);

dF[u] := Vector(%id = 18807224)

dF[v] := Vector(%id = 18807824)

>    n := dF[u] &x dF[v];

n := Vector(%id = 19071112)

>    N := Normalize(n, 2, inplace):

>    N := simplify(N) assuming real;

N := Vector(%id = 18479956)

>    dN := Jacobian(N, [u, v, w]):

>    dNt := subs({u=t, v=cos(t)}, dN):

>    dNt0 := subs(t=0, dNt);

dNt0 := Matrix(%id = 2501580)

>    E := Eigenvalues(dNt0);

E := Vector(%id = 2968652)

>    kappa[1][t=0] := E[2];

kappa[1][t = 0] := 2/25*5^(1/2)

>    kappa[2][t=0] := E[3];

kappa[2][t = 0] := -2/5*5^(1/2)

      The eigenvectors of dN  are the principal directions.

>    E := Eigenvectors(dNt0, output='vectors');

E := Matrix(%id = 17047820)

>    e[1] := <0, -1/2, 1>;

e[1] := Vector(%id = 18237972)

>    e[2] := <1, 0, 0>;

e[2] := Vector(%id = 2571084)

>    C := subs({u=t, v=cos(t)}, F);

C := Vector(%id = 17780332)

>    C0 := subs(t=0, C);

C0 := Vector(%id = 18137224)

>    P1 := plot3d(F, u=-2..2, v=-2..2, color=aquamarine, style=wireframe, axes=normal):

>    P2 := spacecurve({evalm(C0+s*e[1]), evalm(C0+s*e[2])}, s=-1..1, color=red, thickness=2):

>    P3 := spacecurve(evalm(C), t=-2..2, color=blue, thickness=2):

>    display(P1, P2, P3);

[Maple Plot]

 

Gaussian Curvature  

 

>    restart: with(LinearAlgebra): with(VectorCalculus):with(linalg):

The Gaussian curvature K  = kappa[1]*kappa[2]  .  The mean curvature H = (kappa[1]+kappa[2])/2  .

In the coordinate basis of the ambient space , [u, v, w], let N = [n[1], n[2], n[3]] .

>    N := [n(u, v)[1], n(u, v)[2], n(u, v)[3]];

N := [n(u,v)[1], n(u,v)[2], n(u,v)[3]]

>    dN := Jacobian(N, [u, v, w]);

dN := Matrix(%id = 17610676)

>    E := eigenvalues(dN);

E := 0, 1/2*diff(n(u,v)[1],u)+1/2*diff(n(u,v)[2],v)+1/2*(diff(n(u,v)[1],u)^2-2*diff(n(u,v)[1],u)*diff(n(u,v)[2],v)+diff(n(u,v)[2],v)^2+4*diff(n(u,v)[2],u)*diff(n(u,v)[1],v))^(1/2), 1/2*diff(n(u,v)[1],u...
E := 0, 1/2*diff(n(u,v)[1],u)+1/2*diff(n(u,v)[2],v)+1/2*(diff(n(u,v)[1],u)^2-2*diff(n(u,v)[1],u)*diff(n(u,v)[2],v)+diff(n(u,v)[2],v)^2+4*diff(n(u,v)[2],u)*diff(n(u,v)[1],v))^(1/2), 1/2*diff(n(u,v)[1],u...

>    K := expand(E[2]*E[3]);

K := diff(n(u,v)[1],u)*diff(n(u,v)[2],v)-diff(n(u,v)[2],u)*diff(n(u,v)[1],v)

>    H := (E[2]+E[3])/2;

H := 1/2*diff(n(u,v)[1],u)+1/2*diff(n(u,v)[2],v)

Both K  and H  are independent of the z component of N, and are equal, respectively, to the determinant and trace of the minor of A[33]    

In the local  coordinate basis, x[u], x[v]  :

        N[u] = a[11]*x[u]+a[12]*x[v]

        N[v] = a[21]*x[u]+a[22]*x[v]

>    A := Matrix([[a[11], a[12]], [a[21], a[22]]]);

A := Matrix(%id = 18483928)

>    dN := A*Matrix([[x[u]], [x[v]]])=A.Matrix([[x[u]], [x[v]]]);

dN := Matrix(%id = 18483928)*Matrix(%id = 2588240) = Matrix(%id = 17591040)

In this basis dN  is given by the A matrix.

The eigenvalues of the A matrix are:

>    e := Eigenvalues(A);

e := Vector(%id = 12352048)

>    K := expand(e[1]*e[2]);

K := -a[21]*a[12]+a[22]*a[11]

K is the determinant of the A matrix.

>    H := (e[1]+e[2])/2;

H := 1/2*a[22]+1/2*a[11]

H is 1/2 Tr(A).

Since N  is a map from the surface, F ( u, v ), to the unit sphere, dN  is a map from the tangent space of   F ( u, v ) to the tangent space of the sphere. More specifically, let x  = [u(t), v(t)] be a curve embedded in the surface and tau  be a unit tangent vector at  point p .

I[p] ( tau ) = < tau , tau >       

II[p]  ( tau ) = -<  dN ( tau ), tau  >

II[p] = -dN*I[p]           

In matrix form, recollecting the designation of the coefficients of I[p]  and II[p] .

>    N := 'N':F := 'F':E := 'E':

>    II_[p] := <<L|M>, <M|N>>;

II_[p] := Matrix(%id = 12745576)

>    I_[p] := <<E|F>, <F|G>>;

I_[p] := Matrix(%id = 12851152)

>    A := A;

A := Matrix(%id = 12241108)

>    Eq1 := II_[p]=-A*I_[p];

Eq1 := Matrix(%id = 12745576) = -Matrix(%id = 12241108)*Matrix(%id = 12851152)

>    invI_[p] := MatrixInverse(I_[p]);

invI_[p] := Matrix(%id = 16087148)

>    Eq2 := A=simplify(-II_[p].invI_[p]);

Eq2 := Matrix(%id = 12241108) = Matrix(%id = 13000828)

This provides an explicit formula for the A matrix components.

Dupin Indicatrix

For unit vectors, v, in the basis formed by the orthogonal (but not orthonormal) curvature directions, the locus of points:

+/-1 = II[p](v)  is known as the Dupin indicatrix.

>    restart:with(plots): with(VectorCalculus): with(LinearAlgebra):

>    assume(u, real): assume(v, real):
interface(showassumed=0):

>    F := <u, v, u^2-v^2>;

F := Vector(%id = 17045248)

>    dF[u] := diff(F, u); dF[v] := diff(F, v);

dF[u] := Vector(%id = 17045408)

dF[v] := Vector(%id = 17230876)

>    n := dF[u] &x dF[v];

n := Vector(%id = 17046608)

>    N := Normalize(n, 2, inplace);

N := Vector(%id = 17046608)

>    N := simplify(N) assuming real;

N := Vector(%id = 17936408)

>    dN := Jacobian(N, [u, v, w]):

>    dNt := subs({u=t, v=cos(t)}, dN):

>    dNt0 := subs(t=0, dNt);

dNt0 := Matrix(%id = 18518480)

>    E := Eigenvectors(dNt0, output='vectors');

E := Matrix(%id = 18728420)

>    e[1] := convert(Column(E, 1), Vector[row]);

e[1] := Vector(%id = 3212040)

>    e[2] := convert(Column(E, 2), Vector[row]);

e[2] := Vector(%id = 3211340)

>    V := VectorScalarMultiply(e[1], u)+VectorScalarMultiply(e[2], v);

V := Vector(%id = 17304060)

>    eq1 := 1=eval(BilinearForm(V, V, dNt0));

eq1 := 1 = (2/25*u*5^(1/2)-4/25*(-2*u+v)*5^(1/2))*u

>    eq2 := -1=eval(BilinearForm(V, V, dNt0));

eq2 := -1 = (2/25*u*5^(1/2)-4/25*(-2*u+v)*5^(1/2))*u

Actually, the Dupin indicatrix is defined on normalized vectors but this would only complicate the arithmetic and add nothing to the picture.

>    implicitplot({eq1, eq2}, u=-5..5, v=-5..5, numpoints=1000);

[Maple Plot]

This gives substance to the designation "hyperbolic point"  for those points on a surface with negative Gausian curvature.

>    Eg := Eigenvalues(dNt0);

Eg := Vector(%id = 19598168)

>    K := Eg[2]*Eg[3];

K := -4/25

In the case of a point with positive Gaussian curvature:

>    restart: with(LinearAlgebra): with(VectorCalculus): with(plots):

>    assume(u, real): assume(v, real):

>    interface(showassumed=0):

>    G := <u, v, u^2+v^2>;

G := Vector(%id = 19893236)

>    dG[u] := diff(G, u); dG[v] := diff(G, v);

dG[u] := Vector(%id = 17321308)

dG[v] := Vector(%id = 20061788)

>    n := dG[u] &x dG[v];

n := Vector(%id = 17321468)

>    N := Normalize(n, 2, inplace):

>    N := simplify(N) assuming real;

N := Vector(%id = 2717436)

>    dN := Jacobian(N, [u, v, w]):

>    dNt := subs({u=t, v=cos(t)}, dN):

>    dNt0 := subs(t=0, dNt);

dNt0 := Matrix(%id = 2478932)

>    E := Eigenvectors(dNt0, output='vectors');

E := Matrix(%id = 20988556)

>    e[2] := <0, 1/2, 1>;

e[2] := Vector(%id = 17106852)

>    e[1] := <1, 0, 0>;

e[1] := Vector(%id = 17108812)

>    V := VectorScalarMultiply(e[1], u)+VectorScalarMultiply(e[2], v);

V := Vector(%id = 17264976)

>    eq1 := 1=eval(BilinearForm(V, V, dNt0));

eq1 := 1 = -2/5*u^2*5^(1/2)-1/10*v^2*5^(1/2)

>    eq2 := -1=eval(BilinearForm(V, V, dNt0));

eq2 := -1 = -2/5*u^2*5^(1/2)-1/10*v^2*5^(1/2)

>    implicitplot({eq1, eq2}, u=-5..5, v=-5..5, numpoints=2000, scaling=constrained);

[Maple Plot]

The designation "elliptic point"  for those points on a surface with positive Gaussian curvature seems appropriate.

>    Eg := Eigenvalues(dNt0);

Eg := Vector(%id = 20005520)

>    K := Eg[2]*Eg[3];

K := 4/25

Now we visualize the surface G(u, v), together with the Dupin indicatrix and the curvature directions at the point u=0, v=1.

First we recollect the curvature directions.

>    e[1] := e[1];

e[1] := Vector(%id = 17108812)

>    e[2] := e[2];

e[2] := Vector(%id = 17106852)

      Construct a third orthogonal axis.

>    e[3] := e[2] &x e[1];

e[3] := Vector(%id = 3057656)

     The matrix of basis transformation:

>    with(linalg): T := stackmatrix(e[1], e[2], e[3]);

Warning, the previous bindings of the names GramSchmidt and Wronskian have been removed and they now have an assigned value

Warning, the protected names norm and trace have been redefined and unprotected

T := matrix([[1, 0, 0], [0, 1/2, 1], [0, 1, -1/2]])

>    whattype(T);

symbol

>    T := convert(T, Matrix);

T := Matrix(%id = 3191056)

The relationship between our local coordinate system and the ambient system is:  

>    eq := <<e_[1], e_[2], e_[3]>> = T*<<e[x], e[y], e[z]>>;

eq := Matrix(%id = 21795348) = Matrix(%id = 3191056)*Matrix(%id = 17099492)

The matrix of coordinate transformation:

>    TTinv := Transpose(MatrixInverse(T));

TTinv := Matrix(%id = 19810076)

Solve the equation of the indicatrix for one variable.

>    V := solve(eq2, v);

V := (2*5^(1/2)-4*u^2)^(1/2), -(2*5^(1/2)-4*u^2)^(1/2)

Define the two halves of the indicatrix as vectors.  

>    C1 := <u, V[1], 0>;

C1 := Vector(%id = 21543372)

>    C2 := <u, V[2], 0>;

C2 := Vector(%id = 19579912)

Transform the vector components with the proper transformation matrix.

>    Ct1 := TTinv.C1;

Ct1 := Vector(%id = 22060464)

>    Ct2 := TTinv.C2;

Ct2 := Vector(%id = 22029272)

Identify the point on the surface corresponding to u=0, v=1.

>    G0 := subs({u=0, v=1}, G);

G0 := Vector(%id = 19015152)

Plot the indicatrix and the coordinate directions at the indicated pointon the surface, together with a plot of the surface.

>    P1 := spacecurve({evalm(G0+Ct1), evalm(G0+Ct2)}, u=-5..5, numpoints=1000, color=blue, axes=normal, scaling=constrained):

>    P2 := spacecurve({evalm(G0+s*e[1]), evalm(G0+s*e[2])}, s=-2..2, color=red, thickness=2):

>    P3 := plot3d(G, u=-1..1, v=0..1.5, color=aquamarine, style=wireframe):

>    display(P1, P2, P3);

[Maple Plot]