python - 强制 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
没有帮助。
解决方案
似乎所有符号都需要是非交换的,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
......
推荐阅读
- sql - SQL按日期查找条目总和,包括前一个日期
- jwt - Grafana:如何使用 JWT 身份验证?
- git - 我们可以从 Azure Devops 管道提出和合并拉取请求吗?
- c# - 在 ABP C# 中捕获连接错误异常
- c# - 在两个实例化对象之间均匀实例化块
- node.js - 如何使用 jest 模拟这个 http 请求?
- git - bitbucket 中的 PR 差异
- javascript - 从 Vue 中的其他 js 文件调用 store.js 中的函数
- node.js - 带有 react 和 websockets 的应用程序的 Webpack 配置
- git - 安装 Big Sur 后,无法再通过 HTTPS git clone large repos