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
我正在使用 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