gpt4 book ai didi

math - 简化表达

转载 作者:行者123 更新时间:2023-12-01 03:51:28 24 4
gpt4 key购买 nike

我有这样的表达:

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

换句话说:项可以加也可以减,每一项都是一些符号的乘积。

有没有办法提出一个最小/更简单的表达式,基本上是扩展的反向?我试过 simplifyfactor但我不能让他们工作。例如:
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 的 factor只知道如何分解整个表达式,但是如果您知道要根据什么来重写事物的术语,则可以使用 subs 的技巧,例如:

>>> 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 .然后替换 ax + b ,展开事物,然后将其替换回来。

对于更复杂的示例,SymPy 实际上足够智能以替换 a*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.combinations 在这里可能有用)。例如,要尝试分解所有术语的所有组合,但原始表达式中的一个除外:
>>> 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

您可以查看 not isinstance(factored_expr, Add)过滤掉那些没有被分解的。

关于math - 简化表达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22325583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com