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

时间:2011-07-29 21:30:07

标签: python sympy

说我有一个表达式如下:

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

可以将其分解为:

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

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

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)

等式eq1eq2在数学上是等价的,但collect为每个等式输出不同的因子分解,尽管调用collect命令两者都是一样的。这让我想到以下两个问题:

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

1 个答案:

答案 0 :(得分: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)

输出是:

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