Выбор между различными факторизациями выражений в SymPy

Скажем, у меня есть следующее выражение:

a*b*c + b*c + a*d

Его можно разложить на множители как:

b*(a*c + c) + (a*d)

or as

c*(a*b + b) + (a*d)

or as

a*d + b*c*(a + 1)

среди других возможностей.

Для других выражений количество возможностей может быть намного больше.

Мой вопрос: есть ли у SymPy какая-либо утилита, которая позволяет пользователю выбирать, какие из них отображать? Есть ли способ указать общий коэффициент / коэффициенты для использования при факторизации / группировке терминов в выражении?

РЕДАКТИРОВАТЬ: Как @ user772649 указывает ниже, я могу использовать для этого collect. Однако collect, похоже, дает разные результаты в зависимости от начальной факторизации математического выражения, например:

a,b,c,d = symbols("a,b,c,d")

# These two equations are mathematically equivalent:
eq1 = a*b*c + b*c + a*d
eq2 = a*d + b*c*(a + 1)

print collect(eq1, a)
print collect(eq2, a)

печатает:

a*(b*c + d) + b*c
a*d + b*c*(a + 1)

Уравнения eq1 и eq2 математически эквивалентны, но collect выводит разную факторизацию для каждого из них, несмотря на то, что вызов команды collect был одинаковым для обоих. Это подводит меня к следующим двум вопросам:

  1. Есть ли способ «развернуть» выражение перед вызовом collect?
  2. Есть ли способ «сбора» (разложения выражения) на множители, инвариантный по отношению к исходной факторизации, без необходимости сначала расширять выражение?

person Amelio Vazquez-Reina    schedule 29.07.2011    source источник
comment
Разве вы не можете учесть это в c * b * (a + 1) + (a * d)?   -  person TorelTwiddler    schedule 30.07.2011
comment
Да, спасибо @TorelTwiddler. Я добавил это к вопросу.   -  person Amelio Vazquez-Reina    schedule 30.07.2011
comment
@ Дон Роби: ?? Я работаю с очень большими выражениями и хотел бы получить факторизацию по определенному набору одночленов.   -  person Amelio Vazquez-Reina    schedule 30.07.2011
comment
Извините, я неверно истолковал. Я удалил свой тупой комментарий. Ничего общего с приоритетом операторов.   -  person Don Roby    schedule 30.07.2011


Ответы (1)


используйте collect ():

from sympy import *

a,b,c,d = symbols("a,b,c,d")
eq = a * b * c + b * c + a * d
print collect(eq, b)
print collect(eq, c)
print collect(eq, b*c)

вывод:

a*d + b*(c + a*c)
a*d + c*(b + a*b)
a*d + b*c*(1 + a)
person HYRY    schedule 29.07.2011
comment
Спасибо @ user772649. Есть ли способ извлечь символы из выражения перед вызовом collect? У меня проблемы с работой с выражениями, которые были созданы в функциях или выражениях, использующих символы, к которым у меня больше нет доступа. Например, если я вызываю collect(expression, Symbol('Variable')), где выражение имеет несколько экземпляров Variable, это не сработает. - person Amelio Vazquez-Reina; 30.07.2011
comment
можешь привести пример? в качестве примера в вопросе работает collect (eq, Symbol (b) * Symbol (c)). - person HYRY; 30.07.2011
comment
Да @ user772649. Я обновил вопрос, думаю, проблема в том, что collect выводит другой результат для разных (математически эквивалентных) выражений. - person Amelio Vazquez-Reina; 01.08.2011