如何在符号中简化为和记法

  • 本文关键字:记法 符号 python sympy
  • 更新时间 :
  • 英文 :


有可能以某种方式将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,就可以得到更好的表达。

最新更新