首页 > 解决方案 > 强制 SymPy 符号不与矩阵通勤

问题描述

我正在使用 SymPy 来求解线性矩阵方程组。但是,我没有使用 SymPy 的 MatrixSymbol 对象,因为它似乎与solve_linear_system. 因此,我只是使用带有 的普通符号commutative=False,这似乎工作正常。

但是,当我尝试最终替换矩阵来评估解决方案时,我遇到了非交换 SymPy 符号仍然允许与 SymPy 矩阵交换的问题。例如:

import sympy as sy

A, B = sy.symbols('A, B', commutative=False)
expr = A*B

print(expr.subs(A, sy.eye(2)))
print(expr.subs(B, sy.eye(2)))

Matrix([
[1, 0],
[0, 1]])*B
Matrix([
[1, 0],
[0, 1]])*A

当代入多个值时,这会导致不正确的矩阵乘法顺序:

X = sy.Matrix([[1,1],[0,0]])
Y = sy.Matrix([[0,1],[0,1]])

print(expr.subs({A: X, B: Y}))
print(X*Y)

Matrix([[0, 0], [0, 0]])
Matrix([[0, 2], [0, 0]])

有没有办法在替换过程中避免符号与矩阵交换?simultaneous=True在通话中使用subs没有帮助。

标签: pythonmatrixsympysymbolscommutativity

解决方案


似乎所有符号都需要是非交换的,SymPy 才能尊重非交换性。因此,如果我定义一个可交换符号和一个非交换符号,那么 SymPy 将假定它们是可交换的:

In [15]: A = Symbol('A', commutative=False)                                                                                                                   

In [16]: B = Symbol('B', commutative=True)                                                                                                                    

In [17]: A*B                                                                                                                                                  
Out[17]: B⋅A

In [18]: A*B - B*A                                                                                                                                            
Out[18]: 0

我想这意味着当您替换交换单位矩阵时,SmyPy 很乐意重新排序因子:

In [3]: ask(Q.commutative(eye(2)))                                                                                                                            
Out[3]: True

一般来说,我不确定非交换性在 SymPy 中的效果如何,但我原以为你会更好地使用MatrixSymbol. 也许解决这些问题比解决这些问题更容易solve_linear_system......


推荐阅读