Sympy:如何从总和中分解常数?

问题描述 投票:0回答:2

作为 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)从求和中作为乘法因子,但我不知道如何实现这一点。我尝试过收集、分解和其他功能,但没有成功。您能帮我指出正确的方向吗?

python sympy
2个回答
2
投票

这里有相同的@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

更新:

SymPy 的当前版本提供:

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

1
投票

看看这个GitHub问题,目前似乎没有任何方法可以分解出与求和无关的项。也许这将在 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()
将它们拆分为一个列表,对每个项运行解决方法,然后将它们重新添加到单个表达式中。

© www.soinside.com 2019 - 2024. All rights reserved.