Sympy:如何使用第二个量化模块获得简化的换向器?

问题描述 投票:0回答:1

因此,我想利用[b,bd] = 1(其中[]是换向器)这一事实,使用sympy而不是手工来获得一些更复杂的表达式的换向器,但是,我得到了一个庞大的表达式,包含换向器,但未替换为1,这是代码

from sympy import *
from sympy.physics.secondquant import * 
comm1=simplify(Commutator(B(0),Bd(0)).doit())
comm1

在这种情况下的输出为1,它对应于[b,bd] = 1的情况,但是如果我输入一个更复杂的表达式,例如


w1,w2,g=symbols('w1 w1 g')
H=w1*B(0)*Bd(0)+w2*B(1)*Bd(1)+g*Bd(0)*B(1)+conjugate(g)*Bd(1)*B(0)

comm2=simplify(Commutator(H,B(0)))
print(simplify(comm2))

我知道

-g*(AnnihilateBoson(0)*CreateBoson(0)*AnnihilateBoson(1) - CreateBoson(0)*AnnihilateBoson(1)*AnnihilateBoson(0)) - w1*(AnnihilateBoson(0)*AnnihilateBoson(1)*CreateBoson(1) - AnnihilateBoson(1)*CreateBoson(1)*AnnihilateBoson(0)) + w1*(AnnihilateBoson(0)*CreateBoson(0)*AnnihilateBoson(0) - AnnihilateBoson(0)**2*CreateBoson(0)) - conjugate(g)*(AnnihilateBoson(0)*CreateBoson(1)*AnnihilateBoson(0) - CreateBoson(1)*AnnihilateBoson(0)**2)

如果替换[b,bd] = 1,显然可以简化很多,有人知道如何做到吗?还是有人可以将我指向能够执行此操作的其他工具?

python sympy symbolic-math symbolic-references
1个回答
0
投票

关键技巧始终是使用换向关系将'a'或'a ^ \ dagger'移至左侧,直到您不能再这样做为止。

我没有一个很好的Sympy答案,但是由于您询问了其他工具,所以这里有一个关于如何在Cadabra(https://cadabra.science)中进行操作的无耻插件(它使用Sympy进行各种操作,尽管不是这种特殊的计算) 。首先使用以下方法设置两组创建/ creation灭运算符:

{a_{0}, ad_{0}}::NonCommuting;
{a_{1}, ad_{1}}::NonCommuting;
{a_{0}, ad_{0}, a_{1}, ad_{1}}::SortOrder.

他们的打印效果会更好

\bar{#}::Accent;
ad_{n?}::LaTeXForm("a^\dagger",n?,"").

您的哈密顿量:

H:= w_{1} a_{0} ad_{0} + w_{2} a_{1} ad_{1} + g ad_{0} a_{1} + \bar{g} ad_{1} a_{1};

您要计算的换向器:

ex:= @(H) a_{0} - a_{0} @(H);

只需对此进行扩展(不使用[a,ad] = 1换向器进行简化)就可以完成

distribute(ex);
sort_product(ex);

第二行中具有不同下标的运算符彼此之间移动,但保持具有相同下标的运算符的顺序。应用换向器,直到表达式不再更改:

converge(ex):
    substitute(ex, $a_{n?} ad_{n?} = ad_{n?} a_{n?} + 1$)
    distribute(ex)
;

最终给出'-a_0 w_1-a_1 g'。

© www.soinside.com 2019 - 2024. All rights reserved.