Сделайте все символы коммутативными в симпозиумном выражении

Допустим, у вас есть несколько некоммутативных символов в симпозиумном выражении, например

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

Каков предпочтительный способ сделать все символы в выражении коммутативными, например, sympy.simplify(allcommutative(expr)) = c * (a + b)?

В этом ответе говорится, что нет способа изменить коммутативность символа после создания без замены символа, но может есть простой способ заменить в блоках все символы такого выражения?


person glS    schedule 16.01.2018    source источник
comment
Почему они были созданы как некоммутативные, если предполагалось, что они должны быть коммутативными?   -  person user2357112 supports Monica    schedule 17.01.2018
comment
@ user2357112 законный вопрос конечно. Моя причина в том, что я хочу принудительно установить определенный порядок в печатном выражении, и установка символов как некоммутативных была самым простым способом, который я нашел для этого.   -  person glS    schedule 17.01.2018


Ответы (2)


Если вы хотите, чтобы 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.

person Community    schedule 16.01.2018
comment
это то, о чем я думал, да. Думаю, тогда нет лучшего способа. Спасибо - person glS; 17.01.2018
comment
@glS Да, я бы хотел сделать x коммутативным, сказав x.is_commutative=True, но я получаю AttributeError: can't set attribute. - person Geremia; 23.08.2018
comment
Почему звонок a, c = sympy.symbols('a c', commutative=False) позже не работает? Кажется, выражения, включающие эти символы, высечены в камне (поскольку subs не работает с ними). - person Geremia; 23.08.2018
comment
Объекты @Geremia Sympy неизменяемы. Ознакомьтесь с разделом документации по распространенным ошибкам. - person ; 23.08.2018

Два комментария:

  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)
person smichr    schedule 18.01.2018