2

假设您在 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)

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

4

2 回答 2

5

如果要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()

这将返回 True。

于 2018-01-16T23:32:38.773 回答
3

两条评论:

  1. 非交换将因素(尽管他们尊重 nc expr 出现的一面)
  2. 尽管您有一个可靠的答案,但通常足够好的简单答案就是对表达式的字符串版本进行 sympify

两者如下图所示:

>>> 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)
于 2018-01-18T04:39:42.153 回答