符号条件和

时间:2014-10-24 06:42:40

标签: python sum sympy symbolic-math

有没有办法计算或至少正确地说明一个有条件地迭代序列的符号和?

例如,如果a(n)是一个序列(实数)而c(n)是一个“条件”(在整数上定义的布尔函数),那么我希望计算,或者至少说明,所有a(n)的{​​{1}}的总和。

正式地,我想做这样的事情:

c(n)

所以n = Symbol('n', integer=True, positive=True) a = 1 / n**2 c = Eq(n%3, 1) ## s = Sum(a, (n, 0, oo), condition=c) 应该是以下总和:

s

当然,在这种情况下,我可以手动定义1/1 + 1/16 + 1/49 + 1/100 + 1/169 + ... ,但我想知道我是否可以自动完成。

编辑:

手动 我的意思是

s

可以对此进行评估(约为Sum(1/(3*n+1)**2, (n, 0, oo)) )。

我做过的尝试(失败了)如下:

1.12173301393634

尝试使用Sum(Eq(n%3, 1) * (1/n**2), (n, 0, oo)) 结果

对此进行评估
.evalf()

编辑(2):

这是另一次尝试,产生了错误的结果:

AttributeError: 'BooleanFalse' object has no attribute '_eval_evalf'

要么我做错了什么,要么就是这个问题。

3 个答案:

答案 0 :(得分:0)

使用Piecewise绝对是正确的方法。错误的结果是SymPy中的错误,您应该在https://github.com/sympy/sympy/issues/new报告。你的第二种方法不起作用,因为在SymPy中,布尔值不是隐式整数(True和False不是1和0)。

答案 1 :(得分:0)

或者通过将函数定义为1 /(3 * n + 1)** 2

来避免分段
>>> Sum((3*n + 1)**(-2), (n, 0, oo))
Sum((3*n + 1)**(-2), (n, 0, oo))
>>> print filldedent(_.doit())

exp(-4*I*pi/3)*polylog(2, exp_polar(4*I*pi/3))/3 + pi**2/18 +
exp(-2*I*pi/3)*polylog(2, exp_polar(2*I*pi/3))/3
>>> Sum((3*n + 1)**(-2), (n, 0, oo)).n()
1.12173301393634

您可以通过使用Symbol-trickery看到重映射的工作原理。例如前6个学期:

>>> Add(*[(1/n).subs(n,Symbol(str((3*i+1)**2))) for i in range(5)])
1/49 + 1/169 + 1/16 + 1/100 + 1/1

答案 2 :(得分:0)

如果它是一个线性序列,那么您可以使用Integal的变换方法为您进行转换:

>>> i=Integral(1/x**2,(x,1,oo))
>>> i.transform(x,3*x - 2)
Integral(3/(3*x - 2)**2, (x, 1, oo))
>>> (Sum(*_.args)/3).n(3)  # divide by 3 to handle renorm
1.12