Lesson 11: Adapted Frames - Maple Help
For the best experience, we recommend viewing online help using Google Chrome or Microsoft Edge.

Online Help

All Products    Maple    MapleSim


DifferentialGeometry Lessons

 

Lesson 11: Anholonomic Frames

 

 

Overview

Using FrameData and DGsetup to create an anholonomic frame

Sample calculations with anholonomic frames

Converting vector fields, differential forms and tensors from coordinate frames to anholonomic frames.

Exercises

Overview

For many symbolic computations, it is very advantageous to work with a frame or coframe other than the coordinate frame or coframe.  All of the commands in the DifferentialGeometry and Tensor packages are designed to work in any user-defined frame.  Indeed, most of the code in the DifferentialGeometry and Tensor packages does not rely on local coordinate formulas.  In subsequence releases of DifferentialGeometry, this coordinate-free approach will be applied to the JetCalculus package.

 

In this lesson, you will learn to do the following:

– 

Initialize an adapted frame.

– 

Perform calculations in the adapted frame.

– 

Convert vectors, forms, tensors from the adapted frame to the coordinate frame and vice versa.

Using FrameData and DGsetup to create an anholonomic frame

 

There are four steps to creating an anholonomic frame on a manifold M:

– 

first, use DGsetup to create a manifold M0, with the same coordinates as those that will be used on M.

– 

define a frame or coframe on M0, that is, a list of vector fields or differential 1-forms on M0 which give a basis for the tangent or cotangent space at each point.

– 

pass this frame or coframe to the command FrameData.  This command computes the dual coframe or frame, the structure equations for the frame and coframe and exterior derivatives of the coordinate functions in terms of the coframe -- in short, all the data needed to perform calculations in the frame.

– 

pass the output of the FrameData command to DGsetup.  At this point, the labels to be used for the frame and coframe can be specified.

 

We illustrate these steps with a simple example.

with(DifferentialGeometry):

 

Step 1.  Define the underlying manifold.

DGsetup([x, y], M0);

frame name: M0

(2.1)

 

Step 2.  Define a frame on M0 -- we shall use the vectors X1 = yD_x and X2 = yD_y.  The structure equations for this frame are [X1, X2] = -X1.  The dual coframe is theta1 = 1/ydx, theta2 = 1/ydy.

M0 > 

Fr := evalDG([y*D_x, y*D_y]);

FryD_x,yD_y

(2.2)

 

Check the structure equations.

M0 > 

LieBracket(Fr[1], Fr[2]) &plus Fr[1];

0D_x

(2.3)

 

Step 3.  Calculate the structure equations for the frame using the FrameData program.  The output of the frame data program is a rather complex DifferentialGeometry object -- what is displayed is simply the structure equations for the given frame or coframe.  The labels E1, E2, ... and Theta1, Theta2, ... are used to display these structure equations.

M0 > 

FD1 := FrameData(Fr, M);

FD1E1,E2=E1

(2.4)

 

Step 4.  Pass the structure equation data FD1 to DGsetup.  We shall label the frame vectors as X1 and X2 and the dual 1-forms by theta1 and theta2.  Remember that these must be unassigned names.  For this example, we add the keyword verbose to the argument list so that the details of the frame being defined is displayed.

M0 > 

DGsetup(FD1, [X], [theta], verbose);

The following coordinates have been protected:

x,y

The following vector fields have been defined and protected:

X1,X2

The following differential 1-forms have been defined and protected:

θ1,θ2

frame name: M

(2.5)

 

Remark.  Exactly the same result can be achieved using the dual basis of 1-forms:

M > 

Omega := DualBasis(Fr);

Ωdxy,dyy

(2.6)

 

M0 > 

FD2 := FrameData(Omega, M);

FD2dΘ1=Θ1`^`Θ2,dΘ2=0

(2.7)
M0 > 

DGsetup(FD2, [X], [theta], verbose);

The following coordinates have been protected:

x,y

The following vector fields have been defined and protected:

X1,X2

The following differential 1-forms have been defined and protected:

θ1,θ2

frame name: M

(2.8)

 

At this point, all calculations with vector fields, differential forms, and tensors can be done with respect to the frame X1, X2 and its dual coframe theta1, theta2.  For  example, here are the exterior derivatives of the coordinate functions in terms of the dual coframe.

M > 

ExteriorDerivative(x);

yθ1

(2.9)
M > 

ExteriorDerivative(y);

yθ2

(2.10)

 

Here are the structure equations for the frame X1, X2.

M > 

LieBracket(X1, X2);

X1

(2.11)

 

Here are the structure equations for the coframe theta1, theta2.

M > 

ExteriorDerivative(theta1);

θ1`^`θ2

(2.12)
M > 

ExteriorDerivative(theta2);

0θ1`^`θ2

(2.13)

 

We note that this structure equation information is available through the Tools command DGinfo.

M > 

Tools:-DGinfo("ExteriorDerivativeFunctionStructureEquations");

yθ1,yθ2

(2.14)
M > 

Tools:-DGinfo("ExteriorDerivativeFormStructureEquations");

θ1`^`θ2,0θ1`^`θ2

(2.15)
M > 

Tools:-DGinfo("LieBracketStructureEquations");

0X1X1X10X1

(2.16)

Sample calculations with anholonomic frames

 

This paragraph is a continuation of the previous one.  We perform some simple calculations using the anholonomic frame X1, X2 and the dual 1-forms theta1, theta2.

 

1.  Lie brackets

M > 

X := evalDG(x*X1 + y*X2);

XxX1+yX2

(3.1)
M > 

Y := evalDG(y^2*X1 - x^2*X2);

Yy2X1x2X2

(3.2)
M > 

LieBracket(X, Y);

2y3+x3X1x2yX2

(3.3)

 

2.  Exterior derivatives

M > 

f := x^2 + y^2;

fx2+y2

(3.4)
M > 

ExteriorDerivative(f);

2xyθ1+2y2θ2

(3.5)
M > 

omega := evalDG(x*y^2*theta1 - theta2);

ωxy2θ1θ2

(3.6)
M > 

ExteriorDerivative(omega);

xy2θ1`^`θ2

(3.7)

 

3.  Lie derivatives

M > 

LieDerivative(Y, f);

2y3x2x2y2

(3.8)
M > 

LieDerivative(X, omega);

3y3xθ1+y+x2y2θ2

(3.9)
M > 

T := evalDG(theta1 &t X1 &t theta2);

Tθ1X1θ2

(3.10)
M > 

LieDerivative(X1, T);

θ2X1θ2

(3.11)

 

4.  Transformations

M > 

Phi := Transformation(M, M, [x = y^2, y = x*y]);

Φx=y2,y=xy

(3.12)
M > 

Pushforward(Phi, X1);

yX2x

(3.13)
M > 

Pushforward(Phi, X2);

2yX1x+X2

(3.14)

 

Note that the Jacobian of Phi is calculated with respect to the frame X1, X2.  (The first column of J contains the components of Phi_*(X1) with respect to X1, X2 and the second column of Phi_*(X2) with respect to X1, X2.

M > 

J := Tools:-DGinfo(Phi, "JacobianMatrix");

J02yxyx1

(3.15)

 

Flows can be calculated from vector fields defined in the anholonomic basis.

M > 

X;

xX1+yX2

(3.16)
M > 

simplify(Flow(X, epsilon));

x=xεy1,y=yεy1

(3.17)

 

5.  Infinitesimal generators

Here are the infinitesimal generators for the action of the Euclidean group on the x-y plane.

M > 

T := Transformation(M, M, [x = cos(theta)*x + sin(theta)*y + a, y = -sin(theta)*x + cos(theta)*y + b]);

Tx=cosθx+sinθy+a,y=sinθx+cosθy+b

(3.18)
M > 

Gamma := InfinitesimalTransformation(T, [a, b, theta]);

ΓX1y,X2y,X1xX2y

(3.19)
M > 

LieAlgebras:-LieAlgebraData(Gamma);

e1,e3=e2,e2,e3=e1

(3.20)

 

6.  Christoffel Symbols and Curvature

M > 

with(Tensor):

M > 

g := evalDG(theta1 &t theta1 + theta2 &t theta2);

gθ1θ1+θ2θ2

(3.21)
M > 

C := Christoffel(g);

Cθ1X2θ1θ2X1θ1

(3.22)
M > 

R := CurvatureTensor(g);

RX1θ2θ1θ2+X1θ2θ2θ1+X2θ1θ1θ2X2θ1θ2θ1

(3.23)

Converting vector fields, differential forms and tensors from coordinate frames to anholonomic frames.

 

We continue with the previous example.

 

To change a DifferentialGeometry object from one frame to another, both defined with respect to the same underlying coordinates, simply

– 

create the identity map and its inverse between the two frames.

– 

use the appropriate DifferentialGeometry command Pushforward (vector fields), Pullback (differential forms), PushPullTensor (tensors).

M > 

Id := Transformation(M0, M, [x = x, y = y]);

Idx=x,y=y

(4.1)
M0 > 

invId := Transformation(M, M0, [x = x, y = y]);

invIdx=x,y=y

(4.2)
M > 

Fr;

yD_x,yD_y

(4.3)
M0 > 

Omega;

dxy,dyy

(4.4)

 

Convert a vector field given in the anholonomic frame to the coordinate frame.

M0 > 

Pushforward(invId, Id, a*X1 + b*X2);

ayD_x+ybD_y

(4.5)

 

Convert a vector field given in the coordinate frame to the anholonomic frame.

M0 > 

Pushforward(Id, invId, a*D_x + b*D_y);

aX1y+bX2y

(4.6)

 

Convert a differential form given in the anholonomic frame to the coordinate frame:

M > 

Pullback(Id, a*theta1 + b*theta2);

adxy+bdyy

(4.7)

 

Convert a differential form given in the coordinate frame to the anholonomic frame.

M0 > 

Pullback(invId, a*dx + b*dy);

ayθ1+ybθ2

(4.8)

 

Convert a tensor field given in the anholonomic frame to the coordinate frame.

M > 

PushPullTensor(invId, Id, X1 &t theta2 &t theta1);

D_xdydxy

(4.9)

 

Convert a tensor field given in the coordinate frame to the anholonomic frame.

M0 > 

PushPullTensor(Id, invId, dx &t D_y &t dx &t dy);

y2θ1X2θ1θ2

(4.10)

Exercises

Exercise 1

 

Construct an orthonormal coframe for the metric g.  Calculate the curvature tensor and its first covariant derivative in terms of this orthonormal frame.

 

M > 

restart: with(DifferentialGeometry): with(Tensor):

DGsetup([x, y, z], M0);

frame name: M0

(5.1.1)
M0 > 

g := evalDG((1/(k^2 + x^2 + y^2 + z^2)^2)*(dx &t dx + dy &t dy + dz &t dz));

gdxdxk2+x2+y2+z22+dydyk2+x2+y2+z22+dzdzk2+x2+y2+z22

(5.1.2)
M0 > 

kappa := k^2+x^2+y^2+z^2;

κk2+x2+y2+z2

(5.1.3)

 

Solution

Define the orthonormal frame.

M0 > 

Omega := evalDG([1/kappa*dx, 1/kappa*dy, 1/kappa*dz]);

Ωdxk2+x2+y2+z2,dyk2+x2+y2+z2,dzk2+x2+y2+z2

(5.1.1.1)

Calculate the structure equations for this frame.  Initialize.

M0 > 

StructureEq := FrameData(Omega, M);

StructureEqdΘ1=2yΘ1`^`Θ2+2zΘ1`^`Θ3,dΘ2=2xΘ1`^`Θ2+2zΘ2`^`Θ3,dΘ3=2xΘ1`^`Θ32yΘ2`^`Θ3

(5.1.1.2)
M0 > 

DGsetup(StructureEq, [E], [omega], verbose);

The following coordinates have been protected:

x,y,z

The following vector fields have been defined and protected:

E1,E2,E3

The following differential 1-forms have been defined and protected:

ω1,ω2,ω3

frame name: M

(5.1.1.3)

 

Write the metric in the orthonormal frame.

M > 

Id := Transformation(M, M0, [x = x, y = y, z = z]);

Idx=x,y=y,z=z

(5.1.1.4)
M > 

G := PushPullTensor(Id, g);

Gω1ω1+ω2ω2+ω3ω3

(5.1.1.5)

 

Compute the Christoffel connection, the curvature tensor, the Ricci scalar, and the covariant derivative of the curvature tensor.

M > 

C := Christoffel(G);

C2yω1E2ω12xω1E2ω2+2zω1E3ω12xω1E3ω32yω2E1ω1+2xω2E1ω2+2zω2E3ω22yω2E3ω32zω3E1ω1+2xω3E1ω32zω3E2ω2+2yω3E2ω3

(5.1.1.6)
M > 

R := CurvatureTensor(C);

R4k2E1ω2ω1ω24k2E1ω2ω2ω1+4k2E1ω3ω1ω34k2E1ω3ω3ω14k2E2ω1ω1ω2+4k2E2ω1ω2ω1+4k2E2ω3ω2ω34k2E2ω3ω3ω24k2E3ω1ω1ω3+4k2E3ω1ω3ω14k2E3ω2ω2ω3+4k2E3ω2ω3ω2

(5.1.1.7)
M > 

R := RicciScalar(G, R);

R24k2

(5.1.1.8)
M > 

CovariantDerivative(R, C);

0ω1

(5.1.1.9)

Exercise 2

 

Use the vector fields X1, X2, and Y1, Y2 to construct two frames on the 2-dimensional manifold M0.  Denote the frame/coframes by E1, E2, omega1, omega2 and F1, F2, sigma1, sigma2.  Express the metric g, given in terms of the first frame as g = omega1^2 + omega2^2, in terms of the second frame.

 

M > 

with(DifferentialGeometry):

M > 

DGsetup([x, y], M0);

frame name: M0

(5.2.1)
M0 > 

X1 := evalDG(1/y*D_x);

X1D_xy

(5.2.2)
M0 > 

X2 := evalDG(1/x*D_y);

X2D_yx

(5.2.3)
M0 > 

Y1 := evalDG(x*y*D_x + y^2*D_y);

Y1xyD_x+y2D_y

(5.2.4)
M0 > 

Y2 := evalDG(x^2*D_x - x*y*D_y);

Y2x2D_xxyD_y

(5.2.5)

 

Solution

Calculate the structure equations for the  two frames and initialize.

M0 > 

StructureEq1 := FrameData([X1, X2], P);

StructureEq1E1,E2=E1yxE2yx

(5.2.1.1)
M0 > 

StructureEq2 := FrameData([Y1, Y2], Q);

StructureEq2E1,E2=xE1+yE2

(5.2.1.2)
M0 > 

DGsetup(StructureEq1, [E], [omega], verbose);

The following coordinates have been protected:

x,y

The following vector fields have been defined and protected:

E1,E2

The following differential 1-forms have been defined and protected:

ω1,ω2

frame name: P

(5.2.1.3)
P > 

DGsetup(StructureEq2, [P], [sigma], verbose);

The following coordinates have been protected:

x,y

The following vector fields have been defined and protected:

P1,P2

The following differential 1-forms have been defined and protected:

σ1,σ2

frame name: Q

(5.2.1.4)

 

Define the metric g in the frame P.

Q > 

g := evalDG(omega1 &t omega1 + omega2 &t omega2);

gω1ω1+ω2ω2

(5.2.1.5)

 

Define the identity transformation from Q to P.

P > 

Id := Transformation(Q, P, [x = x, y = y]);

Idx=x,y=y

(5.2.1.6)

 

Calculate the metric in the frame Q.

Q > 

G := PushPullTensor(Id, g);

G2y4x2σ1σ1+2y2x4σ2σ2

(5.2.1.7)

Exercise 3

 

Let G be the matrix group of 2x2 upper triangular matrices.  Endow G with the frames of left and right invariant vector fields.

 

Solution 1

Here we compute the left and right invariant 1-forms directly using the MatrixMult command from the Tools package.

GR > 

with(DifferentialGeometry): with(Tools):

Q > 

DGsetup([x, y, z], G0);

frame name: G0

(5.3.1.1)
G0 > 

A := Matrix([[x, y], [0, z]]);

 

Calculate the left invariant forms.

G0 > 

B := (A^(-1)) &MatrixMult ExteriorDerivative(A);

G0 > 

OmegaLeft := [B[1, 1], B[1, 2], B[2, 2]];

OmegaLeft:=dxx,dyxydzxz,dzz

(5.3.1.2)
G0 > 

StructureEqLeft := FrameData(OmegaLeft, GL);

StructureEqLeft:=dΘ1=0,dΘ2=Θ1`^`Θ2Θ2`^`Θ3,dΘ3=0

(5.3.1.3)
G0 > 

DGsetup(StructureEqLeft, [L], [theta]);

frame name: GL

(5.3.1.4)

 

Calculate the right invariant forms.

GL > 

ChangeFrame(G0);

GL

(5.3.1.5)
G0 > 

C := ExteriorDerivative(A) &MatrixMult (A^(-1));

G0 > 

OmegaRight := [C[1, 1], C[1, 2], C[2, 2]];

OmegaRight:=dxx,ydxxz+dyz,dzz

(5.3.1.6)
G0 > 

StructureEqRight := FrameData(OmegaRight, GR);

StructureEqRight:=dΘ1=0,dΘ2=Θ1`^`Θ2+Θ2`^`Θ3,dΘ3=0

(5.3.1.7)
G0 > 

DGsetup(StructureEqRight, [R], [sigma]);

frame name: GR

(5.3.1.8)

Solution 2

This time we use the commands LieGroup and InvariantVectorsAndForms from the GroupActions package.

GR > 

restart: with(DifferentialGeometry): with(GroupActions):

DGsetup([x, y, z], G);

frame name: G

(5.3.2.1)
G > 

A := Matrix([[x, y], [0, z]]);

G > 

LG := LieGroup(A, G);

LG:=moduleexportFrame,Identity,LeftMultiplication,RightMultiplication,Inverse;end module

(5.3.2.2)
G > 

type(LG, `module`);

true

(5.3.2.3)
G > 

OmegaLeft, OmegaRight := InvariantVectorsAndForms(LG, output= ["LeftForms", "RightForms"]);

OmegaLeft,OmegaRight:=dxx,dyxydzxz,dzz,dxx,ydxxz+dyz,dzz

(5.3.2.4)
G > 

StructureEqLeft := FrameData(OmegaLeft, GL);

StructureEqLeft:=dΘ1=0,dΘ2=Θ1`^`Θ2Θ2`^`Θ3,dΘ3=0

(5.3.2.5)
G > 

DGsetup(StructureEqLeft);

frame name: GL

(5.3.2.6)
GL > 

StructureEqRight := FrameData(OmegaRight, GR);

StructureEqRight:=dΘ1=0,dΘ2=Θ1`^`Θ2+Θ2`^`Θ3,dΘ3=0

(5.3.2.7)
G > 

DGsetup(StructureEqRight);

frame name: GR

(5.3.2.8)