【问题标题】:Make all symbols commutative in a sympy expression使所有符号在 sympy 表达式中可交换
【发布时间】:2018-01-16 23:02:09
【问题描述】:

假设你在一个 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)

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

【问题讨论】:

  • 如果它们应该是可交换的,为什么它们被创建为不可交换的?
  • @user2357112 当然是合法问题。我的原因是我想在打印的表达式中强制执行特定的排序,并且将符号设置为不可交换是我发现实现这一目标的最简单方法。

标签: python sympy commutativity


【解决方案1】:

如果您希望 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。

【讨论】:

  • 这就是我想的那种,是的。我想那时没有更好的办法。谢谢
  • @glS 是的,我希望我可以通过说x.is_commutative=True 使x 可交换,但我得到AttributeError: can't set attribute
  • 为什么稍后调用a, c = sympy.symbols('a c', commutative=False) 不起作用?似乎涉及这些符号的表达式是一成不变的(因为subs 对它们不起作用)。
  • @Geremia Sympy 对象是不可变的。查看文档的“常见陷阱”部分。
【解决方案2】:

两个cmets:

  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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    相关资源
    最近更新 更多