【问题标题】:Force SymPy symbols to not commute with matrices强制 SymPy 符号不与矩阵通勤
【发布时间】:2019-06-04 20:32:30
【问题描述】:

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

有什么方法可以避免符号在替换过程中与矩阵交换?在subs 调用上使用simultaneous=True 没有帮助。

【问题讨论】:

    标签: python matrix sympy symbols commutativity


    【解决方案1】:

    似乎所有符号都需要是非交换的,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 一起工作比解决这些问题更容易......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      相关资源
      最近更新 更多