A few weeks ago I realize there is a package for working with differential forms in SAGE. So, I’ve tried to take advantage of that!

This is what I’ve learnt so far.

# Define your manifold

If you work with differential forms you should know (probably better than me), that you define forms in a coordinate patch… rarely globally.

I’d like to start with something like this!

sage: reset()
sage: # The variables
sage: var('theta,phi,r')
sage: var("bps", latex_name=r"\bar{\psi}")
sage: var("bph", latex_name=r"\bar{\phi}")
sage: var("bth", latex_name=r"\bar{\theta}")
sage: # The coordinate system
sage: coords = [r,theta, phi, bps, bth, bph]
sage: U = CoordinatePatch((r,theta, phi, bps, bth, bph))
sage: Omega = DifferentialForms(U)

From a previous post a weird declaration of variables has been made.

But don’t lose yourself into the code!!!… the important here is:

Seven variables have been declared,
These are converted into a list,
and also are the coordinated of the Coordinate Patch.
Finally, is the algebra of differential forms. Just like , where is the manifold (in this case the patch).
## Define the differential forms

Differential form have to be defined… like this,

sage: A = DifferentialForm(Omega, 1)
sage: A[1] = -1/4
sage: A[2] = 1/4*(-cos(theta) - sin(theta))
sage: A[3] = cos(bps)*sin(bth)*sin(bph)
sage: A[4] = sin(bps)*cos(bth)*sin(bph)
sage: A[5] = sin(bps)*sin(bth)*cos(bph)

The first line defines as an element of .

The rest of the lines are for setting the components of . Remember that the coordinates run from 0 to 6 in this example! ๐ And, of course, they are ordered strictly as we declared them, i.e.,

## Exterior Differentiation

Once the form has been declared, one might differentiate it by using the *diff* command,

sage: A.diff()

returns

## Showing the forms

It’s very useful to see the formulas in a nice written way… this is one of the features I love the more from SAGE, to see your form, use

sage: show(A)

## Wedge Product

Of course one of the most important operations when working with forms is the wedge product. For using this, try

sage: C = A.wedge(A.diff())
sage: show(C)

it vanishes. One might try to define another form,

sage: B = DifferentialForm(Omega,2)
sage: B[0,1] = sin(bth)

Note that , and has only one non-vanishing component.

Thus, is calculated,

sage: A.wedge(B)

One can also define multiple wedge product,

sage: A.wedge(B.diff()).wedge(B)

Needless to say one can multiply a form by a function, or number.

## Simplifying a form

Forms have not implemented the *simplify_full* attribute, but their components, which are functions, do. So, after a very complicated calculation one might try to implement a long routine of simplification, say,

sage: D = A.wedge(B.diff()).wedge(B)
for i in xrange(Omega.ngens()):
for j in xrange(i+1, Omega.ngens()):
for k in xrange(j+1, Omega.ngens()):
for l in xrange(k+1, Omega.ngens()):
for m in xrange(l+1, Omega.ngens()):
D[i,j,k,l,m] = D[i,j,k,l,m].simplify_full()

In the above, `Omega.ngens()`

returns the dimension of the patch. Additionally, each index runs from the value of the previous plus one, in order to avoid repetition (due to anti-symmetric property) or the zeros values.

if someone find a better way, doesn’t hesitate in post a comment!!! ๐

Well, I think this is much of it! I’ll keep you posted, in case I learn more about ot.

Enjoy life! and Happy Valentine’s day! ๐

Dox

51.609574
-3.980685

Read Full Post »