在SymPy中选择不同的表达因子分解

Ame*_*ina 8 python sympy

说我有一个表达式如下:

a*b*c + b*c + a*d
Run Code Online (Sandbox Code Playgroud)

人们可以把它分解为:

b*(a*c + c) + (a*d)
Run Code Online (Sandbox Code Playgroud)

或者作为

c*(a*b + b) + (a*d)
Run Code Online (Sandbox Code Playgroud)

或者作为

a*d + b*c*(a + 1)
Run Code Online (Sandbox Code Playgroud)

其他可能性.

对于其他表达式,可能性的数量可以大得多.

我的问题是,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)
Run Code Online (Sandbox Code Playgroud)

打印:

a*(b*c + d) + b*c
a*d + b*c*(a + 1)
Run Code Online (Sandbox Code Playgroud)

方程eq1和eq2在数学上是等效的,但collect尽管这样的事实该呼叫到,输出用于它们中的每一个不同的因式分解collect命令是为这两个是相同的.这让我想到以下两个问题:

  1. 有没有办法在调用之前"扩展"表达式collect?
  2. 是否有一种"收集"(分解表达式)的方式,这种方式对初始分解是不变的,而不必先扩展表达式?

HYR*_*YRY 5

使用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)
Run Code Online (Sandbox Code Playgroud)

输出是:

a*d + b*(c + a*c)
a*d + c*(b + a*b)
a*d + b*c*(1 + a)
Run Code Online (Sandbox Code Playgroud)