Sympy:如何将常数除以总和?

时间:2015-03-05 11:31:31

标签: python sympy

作为一个Sympy新手,我试图通过在一个简单的情况下测试驱动它来学习如何使用它(简单的最小二乘拟合直线)。这是我之前计算的结果(下一行是来自iPython的输出):

Sum(2*a*x(i)**2, (i, 1, N)) + Sum(2*b*x(i), (i, 1, N)) + Sum(-2*x(i)**2, (i, 1, N))

我现在想让Sympy将常数(例如2 * a,2 * b和-2)中的总和作为乘法因子,但我不知道如何实现那。我尝试过收集,因素和其他功能无济于事。你愿意在这里指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

看看这个GitHub issue,似乎目前还没有任何方法可以分解出与总和无关的术语。也许这将在未来的SymPy版本中实现。

对于单个Sum术语,@ smichr(在该GitHub页面上)建议解决方法如下:

s = Sum(2*a*x(i)**2, (i, 1, N)) # your first Sum term 
con, dep = factor_terms(s.function.as_independent(*s.variables));
factored_s = con*Sum(dep, *s.args[1:])

将术语factored_s生成为:

2*a*Sum(x(i)**2, (i, 1, N))

对于包含多个Sum术语的表达式,您可以将它们拆分为as_ordered_terms()的列表,对每个术语运行解决方法,然后将它们一起添加到单个表达式中。

答案 1 :(得分:1)

相同的@smichr在这里有基本相同的解决方案:

def cSum(s):
  con, dep = factor_terms(s.function.as_independent(*s.variables))
  return con*Sum(dep, *s.args[1:])

var('a b x N i')
eq = Sum(2*a*x(i)**2, (i, 1, N)) + Sum(2*b*x(i), (i, 1, N)) + \
     Sum(-2*x(i)**2, (i, 1, N))
>>> pprint(eq.replace(lambda s: isinstance(s, Sum), lambda s: cSum(s)))
      N                 N              N
     ___               __             ___
     \  `              \ `            \  `
2*a*  \    2    + 2*b*  )   x(i) - 2*  \    2
      /   x (i)        /_,             /   x (i)
     /__,             i = 1           /__,
    i = 1                            i = 1