0

所以我想利用 [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 被替换,这显然会简化很多,有人知道怎么做吗?或者任何人都可以向我指出另一个能够做到这一点的工具吗?

4

1 回答 1

1

关键技巧始终是使用交换关系将 'a' 或 'a^\dagger' 向左移动,直到你不能再这样做了。

我没有一个好的 Sympy 答案,但既然你问了其他工具,这里有一个关于你如何在 Cadabra 中做到这一点的无耻插件(https://cadabra.science)(它使用 Sympy 做各种事情,虽然不是这个特别计算)。首先使用以下方法设置两组创建/湮没运算符:

{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'。

于 2020-06-08T22:04:19.193 回答