First time here? Check out the FAQ!

Ask Your Question
0

Derivation of a sagemanifold vector (possible bug)

asked 8 years ago

Dox gravatar image

updated 7 years ago

FrédéricC gravatar image

I'm using sage v7.1 with sagemanifold v0.9 to calculate Lie derivatives.

The problem

I define my manifold, with a chart and the vectors which define the symmetry,

M = Manifold(4, 'M', latex_name=r"\mathcal{M}")
X.<t,r,th,ph> = M.chart(r't r:(0,+oo) th:(0,pi):\theta ph:(0,2*pi):\phi')
Lx = M.vector_field('Lx')
Lx[:] = [ 0, 0, -cos(ph), cot(th)*sin(ph) ]
Ly = M.vector_field('Ly')
Ly[:] = [ 0, 0,  sin(ph), cot(th)*cos(ph) ]
Lz = M.vector_field('Lz')
Lz[:] = [ 0, 0, 0, 1]
Lt = M.vector_field('Lt')
Lt[:] = [ 1, 0, 0, 0]

However, if I call the derivative of a component of the vector like

diff( Lx[3], th )

I get a TypeError, because

type( Lx[3] )
<class 'sage.manifolds.coord_func_symb.CoordFunctionSymb'>

and it seems that the function diff only acts on SR expressions.

My bypass

Although I was able to bypass the situation, it would be nice if a solution was provided out of the box, but in case anyone else needs a solution:

I defined my vectors in a Sage way

xi0 = [ 1, 0, 0, 0]
xi1 = [ 0, 0, -cos(ph), cot(th)*sin(ph) ]
xi2 = [ 0, 0,  sin(ph), cot(th)*cos(ph) ]
xi3 = [ 0, 0, 0, 1]

and then assigned them to the SageManifolds vector_field

Lx = M.vector_field('Lx')
Lx[:] = xi1
Ly = M.vector_field('Ly')
Ly[:] = xi2
Lz = M.vector_field('Lz')
Lz[:] = xi3
Lt = M.vector_field('Lt')
Lt[:] = xi0

So, when I need the derivative of a component of the vector, I calculate

diff(xi1[3], th)

Cheers.

Preview: (hide)

1 Answer

Sort by » oldest newest most voted
2

answered 8 years ago

eric_g gravatar image

It's true that the global function diff applies only to symbolic expressions, not to coordinate functions as defined in SageManifolds. But you can use the method diff on them:

sage: Lx[3].diff(th)
-sin(ph)/sin(th)^2

Note that the result is still a coordinate function:

sage: type(Lx[3].diff(th))
<class 'sage.manifolds.coord_func_symb.CoordFunctionSymb'>

To get a symbolic expression, use the method expr():

sage: Lx[3].diff(th).expr()
-sin(ph)/sin(th)^2
sage: type(Lx[3].diff(th).expr())
<type 'sage.symbolic.expression.Expression'>

Another solution is to invoke expr() prior to the global function diff:

sage: diff(Lx[3].expr(), th)
-cos(th)^2*sin(ph)/sin(th)^2 - sin(ph)

Note that in this case, the result is not automatically simplified (this is one of the differences between symbolic expressions and coordinate functions).

Preview: (hide)
link

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 8 years ago

Seen: 501 times

Last updated: Jun 28 '16