数学 – 简化表达

我有一个表达式:

a*b*c + d*e + f - g*h*h + i*a

换句话说:术语可以加或减,每个术语是一些符号的乘积.

有没有办法提出一个最小/更简单的表达式,基本上是扩展的反向?我试过简化和因素,但我不能让它们工作.例如:

a**4 - 4*a**3*b + 6*a**2*b**2 - 4*a*b**3 - a + b**4

应该变成:

(a - b)**4 - a

但是在使用上述命令时它保持不变.

PS:如果这是SymPy根本无法做到的事情,你能否建议一个替代方案呢?

最佳答案 请参阅
sympy factor simple relationship. SymPy的因子只知道如何计算整个表达式,但如果你知道要用术语重写的术语,你可以使用sub的技巧,如:

>>> expr = a**4 - 4*a**3*b + 6*a**2*b**2 - 4*a*b**3 - a + b**4
>>> expr.subs(a, x + b).expand()
-b + x**4 - x
>>> expr.subs(a, x + b).expand().subs(x, a - b)
-a + (a - b)**4

基本上,设x = a – b,使得a = x b.然后用x b替换a,展开,然后将其替换回来.

对于更复杂的示例,SymPy实际上足够智能,可以正确替换表达式中的* b:

>>> expr = (a*b - c*d)**2 - a
>>> expr = expr.expand()
>>> expr
a**2*b**2 - 2*a*b*c*d - a + c**2*d**2
>>> expr.subs(a*b, x + c*d)
-a + c**2*d**2 - 2*c*d*(c*d + x) + (c*d + x)**2
>>> expr.subs(a*b, x + c*d).expand()
-a + x**2
>>> expr.subs(a*b, x + c*d).expand().subs(x, a*b - c*d)
-a + (a*b - c*d)**2

解决这个问题的另一种可能方法是尝试在表达式中使用因子子集的因子(itertools.combinbinations在这里很有用).例如,尝试将所有术语的所有组合分解为原始表达式中的一个组合:

>>> args = Add.make_args(expr)
>>> for comb in combinations(args, len(args) - 1):
...    print(factor(Add(*comb)) + Add(*(set(args) - set(comb))))
...
a**4 - 4*a**3*b + 6*a**2*b**2 - 4*a*b**3 - a + b**4
a**4 - 4*a**3*b + 6*a**2*b**2 - 4*a*b**3 - a + b**4
a**4 - 4*a**3*b + 6*a**2*b**2 - 4*a*b**3 - a + b**4
a**4 - 4*a**3*b + 6*a**2*b**2 - 4*a*b**3 - a + b**4
-a + (a - b)**4
a*(a**3 - 4*a**2*b + 6*a*b**2 - 4*b**3 - 1) + b**4

您可以检查不是isinstance(factored_expr,Add)来过滤掉那些没有分解的那些.

点赞