Скажем, у меня есть следующее выражение:
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
был одинаковым для обоих. Это подводит меня к следующим двум вопросам:
- Есть ли способ «развернуть» выражение перед вызовом
collect
? - Есть ли способ «сбора» (разложения выражения) на множители, инвариантный по отношению к исходной факторизации, без необходимости сначала расширять выражение?
c * b * (a + 1) + (a * d)
? - person TorelTwiddler   schedule 30.07.2011