我有一个 sympy 的表达:
m*a+m*b+n*a+n*b
这可以简化为 (a+b)*(m+n)
,但如果我在其上运行 simplify()
,我只会得到相同的表达式。有什么技巧可以让它变得更简单吗?
我尝试过使用
collect(expression, expression.free_symbols)
,但这最多只能让我得到a⋅(m + n) + b⋅(m + n)
。我曾考虑过尝试对组合运行收集,但这很快就会失控,因为我的实际方程中有更多变量,而且还必须寻找减法等。有没有更好的办法呢?
也欢迎对其他库的建议,但未在 sympy 上修复。
在 SymPy 中,将表达式简化为人们可能喜欢的形式有时会很棘手,因为
simplify()
尝试了各种方法和启发式方法,但不能保证根据人类直觉找到最简化的形式。您的案例涉及以特定方式分解和收集术语,simplify()
可能不会优先考虑。
对于您的具体问题,实现所需简化的一种方法是使用
factor()
函数,该函数尝试将表达式分解为更简单表达式的乘积。如果 factor()
不能直接产生所需的结果,则可能需要将其与 collect()
的策略性使用相结合,并可能需要使用其他 SymPy 功能进行手动操作。
您可以尝试以下策略,其中涉及对表达式进行更明确的操作:
factor()
:直接套用看是否简化成想要的形式。a
和b
,然后m
和n
)来手动操作表达式),然后尝试分解结果。factor()
和collect()
无法根据您的喜好进行简化的模式,您可能需要编写一个自定义函数来识别和操作这些模式。让我们尝试使用 SymPy 简化给定的表达式,看看是否可以实现所需的 ((a + b)