Hi.
On May 23, 2011, at 10:55 PM, Rajeev Singh wrote:
> Hi,
>
> I asked this question on sage mailing list already and it seems appropriate
> to ask here as well. I wish to simplify some calculation that appear in
> quantum mechanics. To begin we use non-commutative variables as -
>
> sage: x, y = sympy.symbols('xy', commutative=False)
> sage: sympy.expand((x+y)**3)
> x**2*y + y**2*x + x*y**2 + y*x**2 + x**3 + y**3 + x*y*x + y*x*y
Just a heads up, starting in the next release, symbols('xy') will create one
symbol named xy, not two symbols x and y. To get around this, you should do
symbols('x y') or symbols('x, y') (this works in the older release too, so you
can start to change your code now).
>
> I want to impose the commutation relation [x,y]=1 and bring the expression to
> normal form (i.e. in all terms y appears before x, e.g. x*y gets replaced by
> y*x + 1). Is it possible to do this?
You can do this by repeatedly calling subs and expanding, i.e.,
In [9]: x, y = symbols('x y', commutative=False)
In [10]: a = expand((x + y)**3)
In [11]: a
Out[11]:
2 2 3 2 2 3
x⋅y⋅x + x⋅y + x ⋅y + x + y⋅x⋅y + y⋅x + y ⋅x + y
In [12]: a.subs(x*y, y*x + 1)
Out[12]:
3 2 2 3
x⋅(1 + y⋅x) + x + y⋅x + y⋅(1 + y⋅x) + y ⋅x + y + (1 + y⋅x)⋅x + (1 + y⋅x)⋅y
In [13]: a.subs(x*y, y*x + 1).expand()
Out[13]:
3 2 2 3
2⋅x + x⋅y⋅x + x + 2⋅y + y⋅x⋅y + 2⋅y⋅x + 2⋅y ⋅x + y
In [16]: a.subs(x*y, y*x + 1).expand().subs(x*y, y*x + 1)
Out[16]:
3 2 2 3
2⋅x + x + 2⋅y + 2⋅y⋅x + y⋅(1 + y⋅x) + 2⋅y ⋅x + y + (1 + y⋅x)⋅x
In [17]: a.subs(x*y, y*x + 1).expand().subs(x*y, y*x + 1).expand()
Out[17]:
3 2 2 3
3⋅x + x + 3⋅y + 3⋅y⋅x + 3⋅y ⋅x + y
This could easily be automated with a while loop (repeat until a is unchanged).
>
> If not then can I get the expression such that x*y**2 appears as x*y*y?
That would be more difficult to do, because y*y is automatically converted to
y**2. But, as you can see, subs is smart enough to handle x*y**2 correctly, so
there's no need to use this much less simple form.
Aaron Meurer
>
> Thanks in advance.
>
> Regards,
> Rajeev
>
> --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/sympy?hl=en.
--
You received this message because you are subscribed to the Google Groups
"sympy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sympy?hl=en.