Plane curves 

Description: 

This worksheet illustrates how to use the atlas package to solve problems in elementary differential geometry. As an example, we calculate the  

curvatures and moving frames of the following plane curves: astroid, cardioid and abstract plane curve. We assume that the astroid is given as a parametric  

curve in the Cartesian coordinate system and that the cardioid is given as a parametric curve in the polar coordinate system. For the abstract plane curve we  

will do the calculations in both systems. 

 

Plot_2d   Plot_2d   Plot_2d  

Solution: 

Load atlas package: 

> restart:
with(atlas):
 

Just for right simplification:
`atlas/simp`:=proc(a) factor(simplify(a,trig)) end: 

Description of the total space `*`(`^`(R, 2)) 

First of all we have to describe the space we are working in. The space is 2-dimensional Euclidean (flat) space i.e. a plane. To define the space we declare domain, forms, vectors, coframe, frame, flat metric and calculate the connection (it is equal to zero of cause). 

Define Euclidean space as a manifold:
Domain(R^2); 

`*`(`^`(R, 2))(2.1.1)
 

Declare 1-forms for the space coframe:
Forms(e[k]=1); 

{e[k]}(2.1.2)
 

Declare vectors for the space frame:
Vectors(E[j]); 

{E[j]}(2.1.3)
 

Declare coframe on the space:
Coframe(e[1]=d(x),e[2]=d(y)); 

[e[1] = d(x), e[2] = d(y)](2.1.4)
 

Declare frame on the space:
Frame(E[k]); 

[E[1] = Diff(``, x), E[2] = Diff(``, y)](2.1.5)
 

Declare flat metric on the space:
Metric(g[R]=d(x)&.d(x)+d(y)&.d(y)); 

g[R] = `+`(`&.`(e[1], e[1]), `&.`(e[2], e[2]))(2.1.6)
 

Calculate connection of the metric:
Connection(Omega); 

Omega[i, j](2.1.7)
 

Astroid 

Define the curve as a manifold:
Domain(A); 

A(2.2.1)
 

Declare constant a:
Constants(a); 

{`+`(`-`(I)), I, Pi, _Z, a, Catalan}(2.2.2)
 

Declare 1-form for curve's coframe
Forms(w[i]=1); 

{e[k], w[i]}(2.2.3)
 

Declare vectors for curve's frame:
Vectors(W[k]); 

{W[k]}(2.2.4)
 

Declare coframe on the curve:
Coframe(w[1]=d(t[a])); 

[w[1] = d(t[a])](2.2.5)
 

Declare frame of the curve:
Frame(W[l]); 

[W[1] = Diff(``, t[a])](2.2.6)
 

Declare mapping of the curve into `*`(`^`(R, 2)):
Mapping(pi,A,R^2,x=a*cos(t[a])^3,
                y=a*sin(t[a])^3);
 

 

pi
`.`(A, `--->`, `*`(`^`(R, 2)))(2.2.7)
 

Calculate metric on the curve using &/ operator:
Metric(g[A] = g[R] &/ pi); 

g[A] = `+`(`*`(9, `*`(`^`(cos(t[a]), 2), `*`(`^`(sin(t[a]), 2), `*`(`^`(a, 2), `*`(`&.`(w[1], w[1])))))))(2.2.8)
 

It is obvious that the metric gives the squared differential of the curve's arc: `*`(`^`(dl, 2)) = `+`(`-`(`*`(9, `*`(`^`(a, 2), `*`(`^`(cos(t[a]), 2), `*`(`+`(cos(t[a]), `-`(1)), `*`(`+`(cos(t[a]), 1), `*`(`^`(dt[b], 2))))))))) 

Calculate invariants of the mapping:
Inv[pi]:=Invariants(pi); 

table( [( curvatures ) = table( [( 1 ) = [`+`(`/`(`*`(`/`(1, 3)), `*`(a, `*`(cos(t[a]), `*`(sin(t[a]))))))] ] ), ( basis ) = table( [( 0 ) = [`+`(`-`(`*`(cos(t[a]), `*`(E[1]))), `*`(sin(t[a]), `*`(E[2...
table( [( curvatures ) = table( [( 1 ) = [`+`(`/`(`*`(`/`(1, 3)), `*`(a, `*`(cos(t[a]), `*`(sin(t[a]))))))] ] ), ( basis ) = table( [( 0 ) = [`+`(`-`(`*`(cos(t[a]), `*`(E[1]))), `*`(sin(t[a]), `*`(E[2...
table( [( curvatures ) = table( [( 1 ) = [`+`(`/`(`*`(`/`(1, 3)), `*`(a, `*`(cos(t[a]), `*`(sin(t[a]))))))] ] ), ( basis ) = table( [( 0 ) = [`+`(`-`(`*`(cos(t[a]), `*`(E[1]))), `*`(sin(t[a]), `*`(E[2...
(2.2.9)
 

Extract tangent normalized vector field: 

> T:=Inv[pi][basis][0];
 

`+`(`-`(`*`(cos(t[a]), `*`(E[1]))), `*`(sin(t[a]), `*`(E[2])))(2.2.10)
 

Extract normal normalized vector field: 

> N:=Inv[pi][basis][1];
 

`+`(`*`(sin(t[a]), `*`(E[1])), `*`(E[2], `*`(cos(t[a]))))(2.2.11)
 

Extract curvature of the curve: 

> kappa:=Inv[pi][curvatures][1];
 

`+`(`/`(`*`(`/`(1, 3)), `*`(a, `*`(cos(t[a]), `*`(sin(t[a]))))))(2.2.12)
 

Let us check the "orthonormality" of the moving frame vectors T and N. To do this we use metric tensor field g[R]:   

> 'g[R](T,T)'=simplify(g[R](T,T));
'g[R](N,N)'=simplify(g[R](N,N));
 

 

g[R](T, T) = 1
g[R](N, N) = 1(2.2.13)
 

> 'g[R](T,N)'=g[R](T,N);
 

g[R](T, N) = 0(2.2.14)
 

Abstract curve (Cartesian) 

Define the curve as a manifold:
Domain(A[c]); 

A[c](2.3.1)
 

Define two functions on the curve:
Functions(xi=xi(t),eta=eta(t)); 

{eta, xi}(2.3.2)
 

Declare 1-form for curve's coframe
Forms(v[i]=1); 

{e[k], v[i], w[i]}(2.3.3)
 

Declare vectors for curve's frame:
Vectors(V[k]); 

{V[k]}(2.3.4)
 

Declare coframe on the curve:
Coframe(v[1]=d(t)); 

[v[1] = d(t)](2.3.5)
 

Declare frame of the curve:
Frame(V[l]); 

[V[1] = Diff(``, t)](2.3.6)
 

Declare mapping of the curve into `*`(`^`(R, 2)):
Mapping(psi,A[c],R^2,x=xi,
                    y=eta);
 

 

psi
`.`(A[c], `--->`, `*`(`^`(R, 2)))(2.3.7)
 

Now we can calculate metric induced on the curve by the mapping.
Metric(g[A[c]] = g[R] &/ psi); 

g[A[c]] = `*`(`+`(`*`(`^`(Diff(xi, t), 2)), `*`(`^`(Diff(eta, t), 2))), `*`(`&.`(v[1], v[1])))(2.3.8)
 

Calculate invariants of the mapping:
Inv[A[c]]:=Invariants(psi); 

table( [( curvatures ) = table( [( 1 ) = [`/`(`*`(`+`(`*`(Diff(eta, t, t), `*`(Diff(xi, t))), `-`(`*`(Diff(xi, t, t), `*`(Diff(eta, t)))))), `*`(`^`(`+`(`*`(`^`(Diff(xi, t), 2)), `*`(`^`(Diff(eta, t),...
table( [( curvatures ) = table( [( 1 ) = [`/`(`*`(`+`(`*`(Diff(eta, t, t), `*`(Diff(xi, t))), `-`(`*`(Diff(xi, t, t), `*`(Diff(eta, t)))))), `*`(`^`(`+`(`*`(`^`(Diff(xi, t), 2)), `*`(`^`(Diff(eta, t),...
table( [( curvatures ) = table( [( 1 ) = [`/`(`*`(`+`(`*`(Diff(eta, t, t), `*`(Diff(xi, t))), `-`(`*`(Diff(xi, t, t), `*`(Diff(eta, t)))))), `*`(`^`(`+`(`*`(`^`(Diff(xi, t), 2)), `*`(`^`(Diff(eta, t),...
table( [( curvatures ) = table( [( 1 ) = [`/`(`*`(`+`(`*`(Diff(eta, t, t), `*`(Diff(xi, t))), `-`(`*`(Diff(xi, t, t), `*`(Diff(eta, t)))))), `*`(`^`(`+`(`*`(`^`(Diff(xi, t), 2)), `*`(`^`(Diff(eta, t),...
(2.3.9)
 

Change coordinates on `*`(`^`(R, 2)) 

To continue with cardioid and abstract polar curves example, we have to change the coordinate system on the manifold `*`(`^`(R, 2)) from Cartesian to polar. We can  

do it easily just by defining another Euclidean domain. 

Define the Euclidean space as a manifold:
Domain(E^2); 

`*`(`^`(E, 2))(2.4.1)
 

Declare 1-forms for the space coframe:
Forms(u[k]=1); 

{e[k], u[k], v[i], w[i]}(2.4.2)
 

Declare vectors for the space frame:
Vectors(U[j]); 

{U[j]}(2.4.3)
 

Declare coframe on the space:
Coframe(u[1]=d(r),u[2]=d(phi)); 

[u[1] = d(r), u[2] = d(phi)](2.4.4)
 

Declare frame on the space:
Frame(U[k]); 

[U[1] = Diff(``, r), U[2] = Diff(``, phi)](2.4.5)
 

Declare mapping of `*`(`^`(E, 2)) into `*`(`^`(R, 2)):
Mapping(f,E^2,R^2,x=r*cos(phi),
                 y=r*sin(phi));
 

 

f
`.`(`*`(`^`(E, 2)), `--->`, `*`(`^`(R, 2)))(2.4.6)
 

Now we can calculate metric induced by the mapping:
Metric(g[E] = g[R] &/ f); 

g[E] = `+`(`&.`(u[1], u[1]), `*`(`^`(r, 2), `*`(`&.`(u[2], u[2]))))(2.4.7)
 

Calculation of the corresponding connection:
Connection(Gamma); 

Gamma[i, j](2.4.8)
 

Let us see the result:
eval(Gamma); 

table( [( 1, 2 ) = `+`(`-`(`*`(r, `*`(u[2])))), ( 2, 2 ) = `/`(`*`(u[1]), `*`(r)), ( 2, 1 ) = `/`(`*`(u[2]), `*`(r)), ( 1, 1 ) = 0 ] )(2.4.9)
 

Cardioid 

Define the curve as a manifold:
Domain(C); 

C(2.5.1)
 

Declare 1-form for curve's coframe
Forms(theta[i]=1); 

{e[k], u[k], v[i], w[i], theta[i]}(2.5.2)
 

Declare vectors for curve's frame:
Vectors(Theta[k]); 

{Theta[k]}(2.5.3)
 

Declare coframe on the curve:
Coframe(theta[1]=d(tau[c])); 

[theta[1] = d(tau[c])](2.5.4)
 

Declare frame of the curve:
Frame(Theta[l]); 

[Theta[1] = Diff(``, tau[c])](2.5.5)
 

Declare mapping of the curve into `*`(`^`(E, 2)):
Mapping(alpha,C,E^2,r=a*(1+cos(tau[c])),
                   phi=tau[c]);
 

 

alpha
`.`(C, `--->`, `*`(`^`(E, 2)))(2.5.6)
 

Calculate metric on the curve using `&/` operator:
Metric(g[C] = g[E] &/ alpha); 

g[C] = `+`(`*`(2, `*`(`^`(a, 2), `*`(`+`(1, cos(tau[c])), `*`(`&.`(theta[1], theta[1]))))))(2.5.7)
 

Calculate invariants of the mapping:
Inv[C]:=Invariants(alpha); 

table( [( curvatures ) = table( [( 1 ) = [`+`(`/`(`*`(`/`(3, 4), `*`(`^`(`+`(2, `*`(2, `*`(cos(tau[c])))), `/`(1, 2)))), `*`(a, `*`(`+`(1, cos(tau[c]))))))] ] ), ( basis ) = table( [( 0 ) = [`+`(`-`(`...
table( [( curvatures ) = table( [( 1 ) = [`+`(`/`(`*`(`/`(3, 4), `*`(`^`(`+`(2, `*`(2, `*`(cos(tau[c])))), `/`(1, 2)))), `*`(a, `*`(`+`(1, cos(tau[c]))))))] ] ), ( basis ) = table( [( 0 ) = [`+`(`-`(`...
table( [( curvatures ) = table( [( 1 ) = [`+`(`/`(`*`(`/`(3, 4), `*`(`^`(`+`(2, `*`(2, `*`(cos(tau[c])))), `/`(1, 2)))), `*`(a, `*`(`+`(1, cos(tau[c]))))))] ] ), ( basis ) = table( [( 0 ) = [`+`(`-`(`...
table( [( curvatures ) = table( [( 1 ) = [`+`(`/`(`*`(`/`(3, 4), `*`(`^`(`+`(2, `*`(2, `*`(cos(tau[c])))), `/`(1, 2)))), `*`(a, `*`(`+`(1, cos(tau[c]))))))] ] ), ( basis ) = table( [( 0 ) = [`+`(`-`(`...
(2.5.8)
 

Abstract curve (polar) 

Let a parametric curve be given by equation r = rho(phi) in polar coordinates: 

Define the curve as a manifold:
Domain(A[p]); 

A[p](2.6.1)
 

Declare function rho = rho(t):
Functions(rho=rho(tau)); 

{eta, rho, xi}(2.6.2)
 

Declare 1-form for curve's coframe
Forms(zeta[i]=1); 

{e[k], u[k], v[i], w[i], theta[i], zeta[i]}(2.6.3)
 

Declare vectors for curve's frame:
Vectors(ZETA[k]); 

{ZETA[k]}(2.6.4)
 

Declare coframe on the curve:
Coframe(zeta[1]=d(tau)); 

[zeta[1] = d(tau)](2.6.5)
 

Declare frame of the curve:
Frame(ZETA[l]); 

[ZETA[1] = Diff(``, tau)](2.6.6)
 

Declare mapping of the curve into `*`(`^`(E, 2)):
Mapping(lambda,A[p],E^2,r=rho,
                       phi=tau);
 

 

lambda
`.`(A[p], `--->`, `*`(`^`(E, 2)))(2.6.7)
 

Calculate metric on the curve using `&/` operator:
Metric(g[A[p]] = g[E] &/ lambda); 

g[A[p]] = `*`(`+`(`*`(`^`(Diff(rho, tau), 2)), `*`(`^`(rho, 2))), `*`(`&.`(zeta[1], zeta[1])))(2.6.8)
 

Calculate invariants of the mapping:
Inv[A[p]]:=Invariants(lambda); 

table( [( curvatures ) = table( [( 1 ) = [`/`(`*`(`+`(`*`(2, `*`(`^`(Diff(rho, tau), 2))), `*`(`^`(rho, 2)), `-`(`*`(Diff(rho, tau, tau), `*`(rho))))), `*`(`^`(`+`(`*`(`^`(Diff(rho, tau), 2)), `*`(`^`...
table( [( curvatures ) = table( [( 1 ) = [`/`(`*`(`+`(`*`(2, `*`(`^`(Diff(rho, tau), 2))), `*`(`^`(rho, 2)), `-`(`*`(Diff(rho, tau, tau), `*`(rho))))), `*`(`^`(`+`(`*`(`^`(Diff(rho, tau), 2)), `*`(`^`...
table( [( curvatures ) = table( [( 1 ) = [`/`(`*`(`+`(`*`(2, `*`(`^`(Diff(rho, tau), 2))), `*`(`^`(rho, 2)), `-`(`*`(Diff(rho, tau, tau), `*`(rho))))), `*`(`^`(`+`(`*`(`^`(Diff(rho, tau), 2)), `*`(`^`...
table( [( curvatures ) = table( [( 1 ) = [`/`(`*`(`+`(`*`(2, `*`(`^`(Diff(rho, tau), 2))), `*`(`^`(rho, 2)), `-`(`*`(Diff(rho, tau, tau), `*`(rho))))), `*`(`^`(`+`(`*`(`^`(Diff(rho, tau), 2)), `*`(`^`...
(2.6.9)
 

>