8

假设我有如下表达式:

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. 有没有一种方法可以“收集”(分解一个表达式)以一种对初始分解不变的方式,而不必先扩展表达式?
4

2 回答 2

5

使用收集():

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)
于 2011-07-29T22:09:34.297 回答
0

一件可能很好的事情是,如果collect给出了多个符号,是否会收集先前分组的子表达式。但是可以提供一个产品来收集(如@HYRY 所示)或类似以下的东西是可能的:

def separatevars_additively(expr, symbols=[]):
    from sympy import factor_terms
    free = set(symbols) or expr.free_symbols
    d = {}
    while free:
        f = free.pop()
        expr, dep = expr.as_independent(f, as_Add=True)
        if dep.has(*free):
            return None
        d[f] = factor_terms(dep)
    if expr:
        d[0] = expr
    return d

var('a:d')
eq = a*b*c + b*c + a*d
def do(i):
    return sum(separatevars_additively(eq,[i]).values())
for i in eq.free_symbols:
    print('%s: %s' % (i, do(i)))

b: a*d + b*c*(a + 1)
a: a*(b*c + d) + b*c
c: a*d + b*c*(a + 1)
d: a*b*c + a*d + b*c
于 2021-11-18T02:57:26.157 回答