DifferentialGeometry Lessons
Lesson 11: Anholonomic Frames
|
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.
| (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]);
|
| (2.2) |
Check the structure equations.
M0 >
|
LieBracket(Fr[1], Fr[2]) &plus Fr[1];
|
| (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);
|
| (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);
|
Remark. Exactly the same result can be achieved using the dual basis of 1-forms:
M >
|
Omega := DualBasis(Fr);
|
| (2.6) |
M0 >
|
FD2 := FrameData(Omega, M);
|
| (2.7) |
M0 >
|
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.
M >
|
ExteriorDerivative(x);
|
| (2.9) |
M >
|
ExteriorDerivative(y);
|
| (2.10) |
Here are the structure equations for the frame X1, X2.
| (2.11) |
Here are the structure equations for the coframe theta1, theta2.
M >
|
ExteriorDerivative(theta1);
|
| (2.12) |
M >
|
ExteriorDerivative(theta2);
|
| (2.13) |
We note that this structure equation information is available through the Tools command DGinfo.
M >
|
Tools:-DGinfo("ExteriorDerivativeFunctionStructureEquations");
|
| (2.14) |
M >
|
Tools:-DGinfo("ExteriorDerivativeFormStructureEquations");
|
| (2.15) |
M >
|
Tools:-DGinfo("LieBracketStructureEquations");
|
| (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);
|
| (3.1) |
M >
|
Y := evalDG(y^2*X1 - x^2*X2);
|
| (3.2) |
| (3.3) |
2. Exterior derivatives
| (3.4) |
M >
|
ExteriorDerivative(f);
|
| (3.5) |
M >
|
omega := evalDG(x*y^2*theta1 - theta2);
|
| (3.6) |
M >
|
ExteriorDerivative(omega);
|
| (3.7) |
3. Lie derivatives
| (3.8) |
M >
|
LieDerivative(X, omega);
|
| (3.9) |
M >
|
T := evalDG(theta1 &t X1 &t theta2);
|
| (3.10) |
M >
|
LieDerivative(X1, T);
|
| (3.11) |
4. Transformations
M >
|
Phi := Transformation(M, M, [x = y^2, y = x*y]);
|
| (3.12) |
M >
|
Pushforward(Phi, X1);
|
| (3.13) |
M >
|
Pushforward(Phi, 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");
|
| (3.15) |
Flows can be calculated from vector fields defined in the anholonomic basis.
| (3.16) |
M >
|
simplify(Flow(X, epsilon));
|
| (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]);
|
| (3.18) |
M >
|
Gamma := InfinitesimalTransformation(T, [a, b, theta]);
|
| (3.19) |
M >
|
LieAlgebras:-LieAlgebraData(Gamma);
|
| (3.20) |
6. Christoffel Symbols and Curvature
M >
|
g := evalDG(theta1 &t theta1 + theta2 &t theta2);
|
| (3.21) |
| (3.22) |
M >
|
R := CurvatureTensor(g);
|
| (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.
|
M >
|
Id := Transformation(M0, M, [x = x, y = y]);
|
| (4.1) |
M0 >
|
invId := Transformation(M, M0, [x = x, y = y]);
|
| (4.2) |
| (4.3) |
| (4.4) |
Convert a vector field given in the anholonomic frame to the coordinate frame.
M0 >
|
Pushforward(invId, Id, a*X1 + b*X2);
|
| (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);
|
| (4.6) |
Convert a differential form given in the anholonomic frame to the coordinate frame:
M >
|
Pullback(Id, a*theta1 + b*theta2);
|
| (4.7) |
Convert a differential form given in the coordinate frame to the anholonomic frame.
M0 >
|
Pullback(invId, a*dx + b*dy);
|
| (4.8) |
Convert a tensor field given in the anholonomic frame to the coordinate frame.
M >
|
PushPullTensor(invId, Id, X1 &t theta2 &t theta1);
|
| (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);
|
| (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);
|
| (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));
|
| (5.1.2) |
M0 >
|
kappa := k^2+x^2+y^2+z^2;
|
| (5.1.3) |
|
Solution
|
|
Define the orthonormal frame.
M0 >
|
Omega := evalDG([1/kappa*dx, 1/kappa*dy, 1/kappa*dz]);
|
| (5.1.1.1) |
Calculate the structure equations for this frame. Initialize.
M0 >
|
StructureEq := FrameData(Omega, M);
|
| (5.1.1.2) |
M0 >
|
DGsetup(StructureEq, [E], [omega], verbose);
|
Write the metric in the orthonormal frame.
M >
|
Id := Transformation(M, M0, [x = x, y = y, z = z]);
|
| (5.1.1.4) |
M >
|
G := PushPullTensor(Id, g);
|
| (5.1.1.5) |
Compute the Christoffel connection, the curvature tensor, the Ricci scalar, and the covariant derivative of the curvature tensor.
| (5.1.1.6) |
M >
|
R := CurvatureTensor(C);
|
| (5.1.1.7) |
M >
|
R := RicciScalar(G, R);
|
| (5.1.1.8) |
M >
|
CovariantDerivative(R, C);
|
| (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):
|
| (5.2.1) |
M0 >
|
X1 := evalDG(1/y*D_x);
|
| (5.2.2) |
M0 >
|
X2 := evalDG(1/x*D_y);
|
| (5.2.3) |
M0 >
|
Y1 := evalDG(x*y*D_x + y^2*D_y);
|
| (5.2.4) |
M0 >
|
Y2 := evalDG(x^2*D_x - x*y*D_y);
|
| (5.2.5) |
|
Solution
|
|
Calculate the structure equations for the two frames and initialize.
M0 >
|
StructureEq1 := FrameData([X1, X2], P);
|
| (5.2.1.1) |
M0 >
|
StructureEq2 := FrameData([Y1, Y2], Q);
|
| (5.2.1.2) |
M0 >
|
DGsetup(StructureEq1, [E], [omega], verbose);
|
P >
|
DGsetup(StructureEq2, [P], [sigma], verbose);
|
Define the metric g in the frame P.
Q >
|
g := evalDG(omega1 &t omega1 + omega2 &t omega2);
|
| (5.2.1.5) |
Define the identity transformation from Q to P.
P >
|
Id := Transformation(Q, P, [x = x, y = y]);
|
| (5.2.1.6) |
Calculate the metric in the frame Q.
Q >
|
G := PushPullTensor(Id, g);
|
| (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);
|
| (5.3.1.1) |
G0 >
|
A := Matrix([[x, y], [0, z]]);
|
| (5.3.1.2) |
Calculate the left invariant forms.
G0 >
|
B := (A^(-1)) &MatrixMult ExteriorDerivative(A);
|
| (5.3.1.3) |
G0 >
|
OmegaLeft := [B[1, 1], B[1, 2], B[2, 2]];
|
| (5.3.1.4) |
G0 >
|
StructureEqLeft := FrameData(OmegaLeft, GL);
|
| (5.3.1.5) |
G0 >
|
DGsetup(StructureEqLeft, [L], [theta]);
|
| (5.3.1.6) |
Calculate the right invariant forms.
| (5.3.1.7) |
G0 >
|
C := ExteriorDerivative(A) &MatrixMult (A^(-1));
|
| (5.3.1.8) |
G0 >
|
OmegaRight := [C[1, 1], C[1, 2], C[2, 2]];
|
| (5.3.1.9) |
G0 >
|
StructureEqRight := FrameData(OmegaRight, GR);
|
| (5.3.1.10) |
G0 >
|
DGsetup(StructureEqRight, [R], [sigma]);
|
| (5.3.1.11) |
|
|
Solution 2
|
|
This time we use the commands LieGroup and InvariantVectorsAndForms from the GroupActions package.
GR >
|
restart: with(DifferentialGeometry): with(GroupActions):
|
| (5.3.2.1) |
G >
|
A := Matrix([[x, y], [0, z]]);
|
| (5.3.2.2) |
G >
|
LG := LieGroup(A, G);
|
| (5.3.2.3) |
| (5.3.2.4) |
G >
|
OmegaLeft, OmegaRight := InvariantVectorsAndForms(LG, output= ["LeftForms", "RightForms"]);
|
| (5.3.2.5) |
G >
|
StructureEqLeft := FrameData(OmegaLeft, GL);
|
| (5.3.2.6) |
G >
|
DGsetup(StructureEqLeft);
|
| (5.3.2.7) |
GL >
|
StructureEqRight := FrameData(OmegaRight, GR);
|
| (5.3.2.8) |
G >
|
DGsetup(StructureEqRight);
|
| (5.3.2.9) |
|
|
|
Ian M. Anderson 2006
|