Loading [MathJax]/jax/output/HTML-CSS/jax.js

First time here? Check out the FAQ!

Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

There are many ways to achieve what you want. For instance, let us consider a differential form F of degree 1 on a 2-dimensional manifold:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: X.coframe()
Coordinate coframe (M, (dx,dy))
sage: dx, dy = X.coframe()[:]
sage: F = x*sin(y^2)*dx + (x-y)*dy
sage: F
1-form on the 2-dimensional differentiable manifold M
sage: F.display()
x*sin(y^2) dx + (x - y) dy

To get the coefficient of dx, we can use one of the following methods:

1) use F[0]

The easiest way is the square bracket operator, which gives access to components of a tensor field:

sage: F[0]
x*sin(y^2)

Note that F[0] is not a Sage symbolic expression but a higher level object: a ChartFunction:

sage: type(F[0])
<class 'sage.manifolds.chart_func.ChartFunctionRing_with_category.element_class'>

If you want a Sage symbolic expression, apply expr() on it:

sage: F[0].expr()
x*sin(y^2)
sage: type(F[0].expr())
<type 'sage.symbolic.expression.Expression'>

Actually, chart functions allow for various internal symbolic representations. The default one is Expression, but SymPy representations are also possible:

sage: F[0].expr('sympy')
x*sin(y**2)
sage: type(F[0].expr('sympy'))
<class 'sympy.core.mul.Mul'>

2) use F[[0]]

The double square bracket operator returns a scalar field:

sage: F[[0]]
Scalar field on the 2-dimensional differentiable manifold M
sage: F[[0]].display()
M --> R
(x, y) |--> x*sin(y^2)

Again, if you want a Sage symbolic expression, apply expr():

sage: F[[0]].expr()
x*sin(y^2)

The chart function F[0] is actually the coordinate representation of the scalar field F[[0]] in the chart X:

sage: F[0] is F[[0]].coord_function(X)
True

3) Apply F to x

Being a form, F sends vector fields to scalar fields. Applying it to the vector field /x, which is dual to the 1-form dx, we get the component of F along dx:

sage: e_x = X.frame()[0]  # d/dx
sage: e_x
Vector field d/dx on the 2-dimensional differentiable manifold M
sage: F(e_x)
Scalar field on the 2-dimensional differentiable manifold M
sage: F(e_x).expr()
x*sin(y^2)

4) Apply x to F

By duality, we have

sage: e_x(F)
Scalar field on the 2-dimensional differentiable manifold M
sage: e_x(F).expr()
x*sin(y^2)

5) Take the interior product with x

sage: F.interior_product(e_x)
Scalar field on the 2-dimensional differentiable manifold M
sage: F.interior_product(e_x).expr()
x*sin(y^2)

Equivalently, we may write

sage: e_x.interior_product(F).expr()
x*sin(y^2)

6) Contract with x

As suggested by @FredericC:

sage: F.contract(e_x)
Scalar field on the 2-dimensional differentiable manifold M
sage: F.contract(e_x).expr()
x*sin(y^2)

Equivalently:

sage: e_x.contract(F).expr()
x*sin(y^2)

Note that, instead of contract(), you can use index notations (with LaTeX syntax) to perform the contraction (assuming summation on repeated indices):

sage: F['_a']*e_x['^a']
Scalar field on the 2-dimensional differentiable manifold M
sage: (F['_a']*e_x['^a']).expr()
x*sin(y^2)
click to hide/show revision 2
No.2 Revision

There are many ways to achieve what you want. For instance, let us consider a differential form F of degree 1 on a 2-dimensional manifold:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: X.coframe()
Coordinate coframe (M, (dx,dy))
sage: dx, dy = X.coframe()[:]
sage: F = x*sin(y^2)*dx + (x-y)*dy
sage: F
1-form on the 2-dimensional differentiable manifold M
sage: F.display()
x*sin(y^2) dx + (x - y) dy

To get the coefficient of dx, we can use one of the following methods:

1) use F[0]

The easiest way is the square bracket operator, which gives access to components of a tensor field:

sage: F[0]
x*sin(y^2)

Note that F[0] is not a Sage symbolic expression but a higher level object: a ChartFunction:

sage: type(F[0])
<class 'sage.manifolds.chart_func.ChartFunctionRing_with_category.element_class'>

If you want a Sage symbolic expression, apply expr() on it:

sage: F[0].expr()
x*sin(y^2)
sage: type(F[0].expr())
<type 'sage.symbolic.expression.Expression'>

Actually, chart functions allow for various internal symbolic representations. The default one is Expression, but SymPy representations are also possible:

sage: F[0].expr('sympy')
x*sin(y**2)
sage: type(F[0].expr('sympy'))
<class 'sympy.core.mul.Mul'>

2) use F[[0]]

The double square bracket operator returns a scalar field:

sage: F[[0]]
Scalar field on the 2-dimensional differentiable manifold M
sage: F[[0]].display()
M --> R
(x, y) |--> x*sin(y^2)

Again, if you want a Sage symbolic expression, apply expr():

sage: F[[0]].expr()
x*sin(y^2)

The chart function F[0] is actually the coordinate representation of the scalar field F[[0]] in the chart X:

sage: F[0] is F[[0]].coord_function(X)
True

3) Apply F to x

Being a form, F sends vector fields to scalar fields. Applying it to the vector field /x, which is dual to the 1-form dx, we get the component of F along dx:

sage: e_x = X.frame()[0]  # d/dx
sage: e_x
Vector field d/dx on the 2-dimensional differentiable manifold M
sage: F(e_x)
Scalar field on the 2-dimensional differentiable manifold M
sage: F(e_x).expr()
x*sin(y^2)

4) Apply x to F

By duality, we have

sage: e_x(F)
Scalar field on the 2-dimensional differentiable manifold M
sage: e_x(F).expr()
x*sin(y^2)

5) Take the interior product with x

sage: F.interior_product(e_x)
Scalar field on the 2-dimensional differentiable manifold M
sage: F.interior_product(e_x).expr()
x*sin(y^2)

Equivalently, we may write

sage: e_x.interior_product(F).expr()
x*sin(y^2)

6) Contract with x

As suggested by @FredericC:@FrédéricC:

sage: F.contract(e_x)
Scalar field on the 2-dimensional differentiable manifold M
sage: F.contract(e_x).expr()
x*sin(y^2)

Equivalently:

sage: e_x.contract(F).expr()
x*sin(y^2)

Note that, instead of contract(), you can use index notations (with LaTeX syntax) to perform the contraction (assuming summation on repeated indices):

sage: F['_a']*e_x['^a']
Scalar field on the 2-dimensional differentiable manifold M
sage: (F['_a']*e_x['^a']).expr()
x*sin(y^2)