有可能以某种方式将sympy表达式简化为和表示法吗?
例如,使用
from sympy import *
init_printing()
x, n = symbols('x n')
expr = x + x**2 + x**3 + x**4 + x**5
我进入IPython控制台:
In [3]: expr
Out[3]:
5 4 3 2
x + x + x + x + x
现在,试图天真地简化它只会产生:
In [4]: simplify(expr)
Out[4]:
⎛ 4 3 2 ⎞
x⋅⎝x + x + x + x + 1⎠
我想看到的是:
In [5]: Sum(x**n, (n, 1, 5))
Out[5]:
5
___
╲
╲ n
╱ x
╱
‾‾‾
n = 1
这在症状上有可能吗?
我在sympy模块中没有看到任何直接实现这一点的方法,但我看到<sympy.simplify.simplify>
类有一个sum_combine
函数,它试图将一个求和列表组合成一个求总和。然后我做了这个:
import sympy
from sympy import *
from sympy.simplify.simplify import sum_combine
init_printing()
x, n = symbols('x n')
expr = x + x**2 + x**3 + x**4 + x**5
def get_sum_terms(expr):
new_terms = []
for term in expr.args:
if isinstance(term, sympy.core.power.Pow):
base = term.base
exp = term.exp
new_term = Sum(base**n, (n, exp, exp))
new_terms.append(new_term)
else:
new_terms.append(Sum(term**n, (n, 1, 1)))
return new_terms
def simplify_to_sum(expr):
sums = []
for term in get_sum_terms(expr):
sums.append(term)
return sum_combine(sums)
pprint(simplify_to_sum(expr))
输出:
5
___
╲
╲ n
╱ x
╱
‾‾‾
n = 1
也许你仍然需要验证simplify_to_sum
的返回是否比原始表达式好,我测试得还不够,但它工作得很好。所有时候simplify_to_sum
都不是更好的,只需要在这里使用simplify
,就可以得到更好的表达。