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
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.
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
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.
Fr := evalDG([y*D_x, y*D_y]);
Fr ≔ y⁢D_x,y⁢D_y
Check the structure equations.
LieBracket(Fr[1], Fr[2]) &plus Fr[1];
0⁢D_x
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.
FD1 := FrameData(Fr, M);
FD1 ≔ E1,E2=−E1
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.
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
Remark. Exactly the same result can be achieved using the dual basis of 1-forms:
Omega := DualBasis(Fr);
Ω ≔ dxy,dyy
FD2 := FrameData(Omega, M);
FD2 ≔ d⁢Θ1=Θ1⁢`^`⁢Θ2,d⁢Θ2=0
DGsetup(FD2, [X], [theta], verbose);
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.
ExteriorDerivative(x);
y⁢θ1
ExteriorDerivative(y);
y⁢θ2
Here are the structure equations for the frame X1, X2.
LieBracket(X1, X2);
−X1
Here are the structure equations for the coframe theta1, theta2.
ExteriorDerivative(theta1);
θ1⁢`^`⁢θ2
ExteriorDerivative(theta2);
0⁢θ1⁢`^`⁢θ2
We note that this structure equation information is available through the Tools command DGinfo.
Tools:-DGinfo("ExteriorDerivativeFunctionStructureEquations");
y⁢θ1,y⁢θ2
Tools:-DGinfo("ExteriorDerivativeFormStructureEquations");
θ1⁢`^`⁢θ2,0⁢θ1⁢`^`⁢θ2
Tools:-DGinfo("LieBracketStructureEquations");
0⁢X1−X1X10⁢X1
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
X := evalDG(x*X1 + y*X2);
X ≔ x⁢X1+y⁢X2
Y := evalDG(y^2*X1 - x^2*X2);
Y ≔ y2⁢X1−x2⁢X2
LieBracket(X, Y);
2⁢y3+x3⁢X1−x2⁢y⁢X2
2. Exterior derivatives
f := x^2 + y^2;
f ≔ x2+y2
ExteriorDerivative(f);
2⁢x⁢y⁢θ1+2⁢y2⁢θ2
omega := evalDG(x*y^2*theta1 - theta2);
ω ≔ x⁢y2⁢θ1−θ2
ExteriorDerivative(omega);
−x⁢y2⁢θ1⁢`^`⁢θ2
3. Lie derivatives
LieDerivative(Y, f);
2⁢y3⁢x−2⁢x2⁢y2
LieDerivative(X, omega);
3⁢y3⁢x⁢θ1+−y+x2⁢y2⁢θ2
T := evalDG(theta1 &t X1 &t theta2);
T ≔ θ1⁢X1⁢θ2
LieDerivative(X1, T);
θ2⁢X1⁢θ2
4. Transformations
Phi := Transformation(M, M, [x = y^2, y = x*y]);
Φ ≔ x=y2,y=x⁢y
Pushforward(Phi, X1);
y⁢X2x
Pushforward(Phi, X2);
2⁢y⁢X1x+X2
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.
J := Tools:-DGinfo(Phi, "JacobianMatrix");
J ≔ 02⁢yxyx1
Flows can be calculated from vector fields defined in the anholonomic basis.
X;
x⁢X1+y⁢X2
simplify(Flow(X, epsilon));
x=−xε⁢y−1,y=−yε⁢y−1
5. Infinitesimal generators
Here are the infinitesimal generators for the action of the Euclidean group on the x-y plane.
T := Transformation(M, M, [x = cos(theta)*x + sin(theta)*y + a, y = -sin(theta)*x + cos(theta)*y + b]);
T ≔ x=cos⁡θ⁢x+sin⁡θ⁢y+a,y=−sin⁡θ⁢x+cos⁡θ⁢y+b
Gamma := InfinitesimalTransformation(T, [a, b, theta]);
Γ ≔ X1y,X2y,X1−x⁢X2y
LieAlgebras:-LieAlgebraData(Gamma);
e1,e3=−e2,e2,e3=e1
6. Christoffel Symbols and Curvature
with(Tensor):
g := evalDG(theta1 &t theta1 + theta2 &t theta2);
g ≔ θ1⁢θ1+θ2⁢θ2
C := Christoffel(g);
C ≔ θ1⁢X2⁢θ1−θ2⁢X1⁢θ1
R := CurvatureTensor(g);
R ≔ −X1⁢θ2⁢θ1⁢θ2+X1⁢θ2⁢θ2⁢θ1+X2⁢θ1⁢θ1⁢θ2−X2⁢θ1⁢θ2⁢θ1
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).
Id := Transformation(M0, M, [x = x, y = y]);
Id ≔ x=x,y=y
invId := Transformation(M, M0, [x = x, y = y]);
invId ≔ x=x,y=y
Fr;
y⁢D_x,y⁢D_y
Omega;
dxy,dyy
Convert a vector field given in the anholonomic frame to the coordinate frame.
Pushforward(invId, Id, a*X1 + b*X2);
a⁢y⁢D_x+y⁢b⁢D_y
Convert a vector field given in the coordinate frame to the anholonomic frame.
Pushforward(Id, invId, a*D_x + b*D_y);
a⁢X1y+b⁢X2y
Convert a differential form given in the anholonomic frame to the coordinate frame:
Pullback(Id, a*theta1 + b*theta2);
a⁢dxy+b⁢dyy
Convert a differential form given in the coordinate frame to the anholonomic frame.
Pullback(invId, a*dx + b*dy);
a⁢y⁢θ1+y⁢b⁢θ2
Convert a tensor field given in the anholonomic frame to the coordinate frame.
PushPullTensor(invId, Id, X1 &t theta2 &t theta1);
D_x⁢dy⁢dxy
Convert a tensor field given in the coordinate frame to the anholonomic frame.
PushPullTensor(Id, invId, dx &t D_y &t dx &t dy);
y2⁢θ1⁢X2⁢θ1⁢θ2
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.
restart: with(DifferentialGeometry): with(Tensor):
DGsetup([x, y, z], M0);
g := evalDG((1/(k^2 + x^2 + y^2 + z^2)^2)*(dx &t dx + dy &t dy + dz &t dz));
g ≔ dx⁢dxk2+x2+y2+z22+dy⁢dyk2+x2+y2+z22+dz⁢dzk2+x2+y2+z22
kappa := k^2+x^2+y^2+z^2;
κ ≔ k2+x2+y2+z2
Solution
Define the orthonormal frame.
Omega := evalDG([1/kappa*dx, 1/kappa*dy, 1/kappa*dz]);
Ω ≔ dxk2+x2+y2+z2,dyk2+x2+y2+z2,dzk2+x2+y2+z2
Calculate the structure equations for this frame. Initialize.
StructureEq := FrameData(Omega, M);
StructureEq ≔ d⁢Θ1=2⁢y⁢Θ1⁢`^`⁢Θ2+2⁢z⁢Θ1⁢`^`⁢Θ3,d⁢Θ2=−2⁢x⁢Θ1⁢`^`⁢Θ2+2⁢z⁢Θ2⁢`^`⁢Θ3,d⁢Θ3=−2⁢x⁢Θ1⁢`^`⁢Θ3−2⁢y⁢Θ2⁢`^`⁢Θ3
DGsetup(StructureEq, [E], [omega], verbose);
x,y,z
E1,E2,E3
ω1,ω2,ω3
Write the metric in the orthonormal frame.
Id := Transformation(M, M0, [x = x, y = y, z = z]);
Id ≔ x=x,y=y,z=z
G := PushPullTensor(Id, g);
G ≔ ω1⁢ω1+ω2⁢ω2+ω3⁢ω3
Compute the Christoffel connection, the curvature tensor, the Ricci scalar, and the covariant derivative of the curvature tensor.
C := Christoffel(G);
C ≔ 2⁢y⁢ω1⁢E2⁢ω1−2⁢x⁢ω1⁢E2⁢ω2+2⁢z⁢ω1⁢E3⁢ω1−2⁢x⁢ω1⁢E3⁢ω3−2⁢y⁢ω2⁢E1⁢ω1+2⁢x⁢ω2⁢E1⁢ω2+2⁢z⁢ω2⁢E3⁢ω2−2⁢y⁢ω2⁢E3⁢ω3−2⁢z⁢ω3⁢E1⁢ω1+2⁢x⁢ω3⁢E1⁢ω3−2⁢z⁢ω3⁢E2⁢ω2+2⁢y⁢ω3⁢E2⁢ω3
R := CurvatureTensor(C);
R ≔ 4⁢k2⁢E1⁢ω2⁢ω1⁢ω2−4⁢k2⁢E1⁢ω2⁢ω2⁢ω1+4⁢k2⁢E1⁢ω3⁢ω1⁢ω3−4⁢k2⁢E1⁢ω3⁢ω3⁢ω1−4⁢k2⁢E2⁢ω1⁢ω1⁢ω2+4⁢k2⁢E2⁢ω1⁢ω2⁢ω1+4⁢k2⁢E2⁢ω3⁢ω2⁢ω3−4⁢k2⁢E2⁢ω3⁢ω3⁢ω2−4⁢k2⁢E3⁢ω1⁢ω1⁢ω3+4⁢k2⁢E3⁢ω1⁢ω3⁢ω1−4⁢k2⁢E3⁢ω2⁢ω2⁢ω3+4⁢k2⁢E3⁢ω2⁢ω3⁢ω2
R := RicciScalar(G, R);
R ≔ 24⁢k2
CovariantDerivative(R, C);
0⁢ω1
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.
X1 := evalDG(1/y*D_x);
X1 ≔ D_xy
X2 := evalDG(1/x*D_y);
X2 ≔ D_yx
Y1 := evalDG(x*y*D_x + y^2*D_y);
Y1 ≔ x⁢y⁢D_x+y2⁢D_y
Y2 := evalDG(x^2*D_x - x*y*D_y);
Y2 ≔ x2⁢D_x−x⁢y⁢D_y
Calculate the structure equations for the two frames and initialize.
StructureEq1 := FrameData([X1, X2], P);
StructureEq1 ≔ E1,E2=E1y⁢x−E2y⁢x
StructureEq2 := FrameData([Y1, Y2], Q);
StructureEq2 ≔ E1,E2=x⁢E1+y⁢E2
DGsetup(StructureEq1, [E], [omega], verbose);
E1,E2
ω1,ω2
frame name: P
DGsetup(StructureEq2, [P], [sigma], verbose);
P1,P2
σ1,σ2
frame name: Q
Define the metric g in the frame P.
g := evalDG(omega1 &t omega1 + omega2 &t omega2);
g ≔ ω1⁢ω1+ω2⁢ω2
Define the identity transformation from Q to P.
Id := Transformation(Q, P, [x = x, y = y]);
Calculate the metric in the frame Q.
G ≔ 2⁢y4⁢x2⁢σ1⁢σ1+2⁢y2⁢x4⁢σ2⁢σ2
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.
with(DifferentialGeometry): with(Tools):
DGsetup([x, y, z], G0);
frame name: G0
A := Matrix([[x, y], [0, z]]);
Calculate the left invariant forms.
B := (A^(-1)) &MatrixMult ExteriorDerivative(A);
OmegaLeft := [B[1, 1], B[1, 2], B[2, 2]];
OmegaLeft:=dxx,dyx−y⁢dzx⁢z,dzz
StructureEqLeft := FrameData(OmegaLeft, GL);
StructureEqLeft:=d⁢Θ1=0,d⁢Θ2=−Θ1⁢`^`⁢Θ2−Θ2⁢`^`⁢Θ3,d⁢Θ3=0
DGsetup(StructureEqLeft, [L], [theta]);
frame name: GL
Calculate the right invariant forms.
ChangeFrame(G0);
GL
C := ExteriorDerivative(A) &MatrixMult (A^(-1));
OmegaRight := [C[1, 1], C[1, 2], C[2, 2]];
OmegaRight:=dxx,−y⁢dxx⁢z+dyz,dzz
StructureEqRight := FrameData(OmegaRight, GR);
StructureEqRight:=d⁢Θ1=0,d⁢Θ2=Θ1⁢`^`⁢Θ2+Θ2⁢`^`⁢Θ3,d⁢Θ3=0
DGsetup(StructureEqRight, [R], [sigma]);
frame name: GR
Solution 2
This time we use the commands LieGroup and InvariantVectorsAndForms from the GroupActions package.
restart: with(DifferentialGeometry): with(GroupActions):
DGsetup([x, y, z], G);
frame name: G
LG := LieGroup(A, G);
LG:=moduleexportFrame,Identity,LeftMultiplication,RightMultiplication,Inverse;end module
type(LG, `module`);
true
OmegaLeft, OmegaRight := InvariantVectorsAndForms(LG, output= ["LeftForms", "RightForms"]);
OmegaLeft,OmegaRight:=dxx,dyx−y⁢dzx⁢z,dzz,dxx,−y⁢dxx⁢z+dyz,dzz
DGsetup(StructureEqLeft);
DGsetup(StructureEqRight);
Download Help Document