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 $\frac{\partial}{\partial x}$
Being a form, $F$ sends vector fields to scalar fields. Applying it to the vector field $\partial/\partial 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 $\frac{\partial}{\partial 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 $\frac{\partial}{\partial 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 $\frac{\partial}{\partial x}$
As suggested by @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)
Contract with a vector field ?
How do I do that? Didn't see it in the basic vector fields manual. EDIT: Nevermind, I found it in the multivector fields manual, and in the differential forms manual.