sympy:用 Braket 符号替换表达式

sympy: substitution of expressions with Braket-notation

我正在使用 sympy(在 sagemath 中)。我想用 Braket 符号(用于量子力学问题)进行替换。下面有一个简单的代码,以重现问题。

from sympy.physics.quantum import Bra, Ket
from sympy import *
theta=symbols('theta',commutative=True)
pi, mu= symbols("pi mu",commutative=False)
W=2*pi*mu
print(W.subs(pi*mu,theta))
V=Bra(pi)*Ket(mu)
print(V.subs(Bra(pi)*Ket(mu),theta))
U=2*Bra(pi)*Ket(mu)
print(U.subs(Bra(pi)*Ket(mu),theta))

输出为:

2*theta
theta
2*<pi|*|mu>

如果没有前导标量乘数,则替换工作正常。我被一个更复杂的表达式卡住了。

在这些场合 srepr 可以说明一些问题:

srepr(U)
# out: "Mul(Integer(2), Bra(Symbol('pi', commutative=False)), Ket(Symbol('mu', commutative=False)))"

srepr(Bra(pi)*Ket(mu))
# out: "InnerProduct(Bra(Symbol('pi', commutative=False)),Ket(Symbol('mu', commutative=False)))"

请注意,第一个输出是 Mul 类型的乘法对象,而第二个输出是 InnerProduct 类型的对象。使用命令 U.subs(Bra(pi)*Ket(mu),theta),您要求在 U 中搜索 InnerProduct 类型的对象,但是存在 none,因此没有进行替换。

在这种情况下,你必须做:

U.subs(Mul(Bra(pi), Ket(mu)),theta)
# out: 2*theta

编辑:或者正如@Oscar Benjamin 指出的那样,您这样做:

from sympy.physics.quantum import qapply
U = qapply(U)
srepr(U)
# out: "Mul(Integer(2), InnerProduct(Bra(Symbol('pi', commutative=False)),Ket(Symbol('mu', commutative=False))))"

现在您可以看到 InnerProduct 作为 Mul 的参数。最后:

U.subs(Bra(pi)*Ket(mu), theta)
# out: 2*theta