【发布时间】:2011-07-29 21:30:07
【问题描述】:
假设我有一个表达式如下:
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)
方程eq1 和eq2 在数学上是等价的,但是collect 为它们中的每一个输出不同的因式分解,尽管对collect 命令的调用对于两者来说是相同的。这让我想到以下两个问题:
- 有没有办法在调用
collect之前“扩展”表达式? - 是否有一种“收集”(对表达式进行因式分解)的方法,该方法对初始因式分解保持不变,而无需先扩展表达式?
【问题讨论】:
-
你不能把它考虑到
c * b * (a + 1) + (a * d)吗? -
是的,谢谢@TorelTwiddler。我将其添加到问题中。
-
@Don Roby: ??我正在处理非常大的表达式,并希望对一组特定的单项式进行因式分解。
-
对不起,我误解了。我已经删除了我的愚蠢评论。与运算符优先级无关。