# Redefine Method in Sage class

I am using the a class to manipulate vector fields of $\mathbb{R}^n$. I am using an other convention on the lie brackets : to compute $XY=[X,Y]$ I have to enter $XY=-X.bracket(Y)$.

I would like to redefine the method "bracket()" so that I include this minus sign in the redefinition.

Of course I can each time put a minus sign in front all my definition or call Y.bracket(X) to compute [X,Y] but I don't want to use them (the display is then not adapted ...).

Here is my code

 from sage import *
reset()

def mybracket(A,B):
return B.bracket(A)

M.<x,y> = EuclideanSpace()
X = M.vector_field(0,1-y*x^2, name='X')
Y = M.vector_field(-(y-1),x, name='Y')

YX = Y.mybracket(X)


AttributeError: 'VectorFieldFreeModule_with_category.element_class' object has no attribute 'mybracket'

Thanks

edit retag close merge delete

Sort by ยป oldest newest most voted

It suffices to attach the function mybracket that you have defined to the vector field class, which is VectorField. You have to import the latter first:

from sage.manifolds.differentiable.vectorfield import VectorField
VectorField.mybracket = mybracket


So the whole code becomes:

from sage.manifolds.differentiable.vectorfield import VectorField
def mybracket(A, B):
return B.bracket(A)
VectorField.mybracket = mybracket


Then

M.<x,y> = EuclideanSpace()
X = M.vector_field(0,1-y*x^2, name='X')
Y = M.vector_field(-(y-1),x, name='Y')
X.mybracket(Y).display()


yields

[Y,X] = (-x^2*y + 1) e_x + (-x^3 + 2*x*y^2 - 2*x*y) e_y


and

X.mybracket(Y) == -X.bracket(Y)


gives

True

more

Out of curiosity, could you do something similar for cython (pyx) files (i mean without creating a new class that inherits from the previous) ?

( 2019-01-22 21:19:13 +0200 )edit