有没有办法计算或至少正确地说明一个有条件地迭代序列的符号和?
例如,如果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()
这是另一次尝试,产生了错误的结果:
AttributeError: 'BooleanFalse' object has no attribute '_eval_evalf'
要么我做错了什么,要么就是这个问题。
答案 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