使所有符号在 sympy 表达式中可交换

Make all symbols commutative in a sympy expression

假设你在一个 sympy 表达式中有许多不可交换的符号,比如

a, c = sympy.symbols('a c', commutative=False)
b = sympy.Symbol('b')
expr = a * c + b * c

使表达式中的所有符号都可交换的首选方法是什么,例如,sympy.simplify(allcommutative(expr)) = c * (a + b)

中指出,在创建后不替换符号就无法更改符号的交换性,但也许有一种简单的方法可以在块中更改表达式的所有符号,例如这个?

如果您希望 Eq(expr, c * (a + b)) 的计算结果为 True,您需要将符号替换为其他通勤符号。例如:

replacements = {s: sympy.Dummy(s.name) for s in expr.free_symbols}
sympy.Eq(expr, c * (a + b)).xreplace(replacements).simplify()

这 returns 是的。

两条评论:

  1. 非交换量会因式分解(尽管它们尊重 nc expr 出现的那一侧)
  2. 虽然您有一个可靠的答案,但一个通常足够好的简单答案就是简化表达式的字符串版本

两者如下所示:

>>> import sympy
>>> a, c = sympy.symbols('a c', commutative=False)
>>> b = sympy.Symbol('b')
>>> expr = a * c + b * c
>>> factor(expr)
(b + a)*c
>>> S(str(_))
c*(a + b)