Actually, it looks like if you are using SymPy 0.6.7, there is a bug that makes
this return a wrong result:
In [1]: x, y = symbols('x y', commutative=False)
In [2]: a = expand((x + y)**3)
In [3]: a.subs(x*y, y*x + 1).expand().subs(x*y, y*x + 1).expand()
Out[3]:
2 2
1 + x + y + 2⋅y⋅x
The output below was from the latest development branch, and will be present in
the next release.
Aaron Meurer
On May 23, 2011, at 11:06 PM, Aaron S. Meurer wrote:
> 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.