作为一个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)中的总和作为乘法因子,但我不知道如何实现那。我尝试过收集,因素和其他功能无济于事。你愿意在这里指出我正确的方向吗?
答案 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