SymPy嵌套对易子中代入矩阵为何出现结果异常?
Sympy量子模块嵌套对易子计算异常的原因
在使用sympy.physics.quantum.Commutator类计算矩阵的嵌套对易子时,出现操作顺序影响结果的异常:
- 先展开对易子表达式(调用
doit()),再替换符号为矩阵,能得到正确的非零结果; - 先将符号替换为矩阵,再调用
doit(),得到的却是错误的零矩阵。
复现代码
import sympy as sp tau_1, tau_2, tau_3 = sp.symbols('tau_1 tau_2 tau_3') A = sp.symbols("A", commutative=False, cls=sp.Function)(tau_1) B = sp.symbols("B", commutative=False, cls=sp.Function)(tau_2) C = sp.symbols("C", commutative=False, cls=sp.Function)(tau_3) matrix_from_symbol = { A: sp.Matrix([[sp.sin(tau_1),sp.sin(tau_1)],[sp.sin(tau_1),1+sp.sin(tau_1)]]), B: sp.Matrix([[sp.sin(tau_2),sp.sin(tau_2)],[sp.sin(tau_2),1+sp.sin(tau_2)]]), C: sp.Matrix([[sp.sin(tau_3),sp.sin(tau_3)],[sp.sin(tau_3),1+sp.sin(tau_3)]]) } from sympy.physics.quantum import Commutator expression = Commutator(A,Commutator(B,C)) doit_then_subs = expression.doit().subs(matrix_from_symbol,simultaneous=True).simplify() sp.pprint(doit_then_subs) # 正确结果:非零矩阵 subs_then_doit = expression.subs(matrix_from_symbol,simultaneous=True).doit() sp.pprint(subs_then_doit) # 错误结果:零矩阵
原因分析
量子模块Commutator的设计定位:
sympy.physics.quantum.Commutator是为处理抽象量子算符设计的,而非具体矩阵对象。当你将矩阵直接替换进Commutator实例后调用doit(),模块会触发针对抽象算符的简化逻辑——默认假设替换后的矩阵是「可交换算符」,因此直接返回零矩阵(因为可交换算符的对易子为零)。两种操作顺序的本质差异:
- 先调用
doit():会先将嵌套对易子展开为纯代数表达式:A*B*C - A*C*B - B*C*A + C*B*A,此时表达式已经脱离了量子模块的Commutator结构,变成普通的非交换代数运算。后续替换矩阵后,Sympy会严格按照矩阵乘法的非交换规则计算,得到正确结果。 - 先替换矩阵再调用
doit():Commutator实例中已经填入了矩阵对象,但量子模块的doit()方法并不会识别矩阵的非交换乘法特性,而是沿用抽象算符的简化逻辑,错误地判定矩阵可交换,进而返回零矩阵。
- 先调用
正确的矩阵对易子计算方式:如果是处理矩阵的对易子,完全不需要使用
sympy.physics.quantum.Commutator,直接用矩阵乘法的定义X*Y - Y*X即可,这才是符合矩阵运算规则的实现方式。
内容的提问来源于stack exchange,提问作者Idieh
相关产品推荐
相关产品推荐

