2012-02-19 73 views
1

zeta function状态SciPy的文档:SciPy的zeta函数返回似地大值

Y =ζ电(X,Q)返回的两个参数黎曼ζ函数: 总和(第(k + q)的** (-x)中,k = 0..inf)

给参数x=2, q=0我们应该得到sum((k)**(-2),k=0..inf)其中根据wiki entry on Riemann zeta function应当得到约1.645

然而SciPy的给出了以下

>>> from scipy.special import zeta 
>>> zeta(2,0) 
1.7976931348623157e+308 

我错过了什么或是scipy zeta功能坏了吗?

+2

注意scipy页面上的总和从0开始,而不是1,因为它通常定义为 – 2012-02-19 23:30:53

+0

这可以解释为什么它导致双倍最大值,我会查看源代码 – 2012-02-19 23:34:16

+0

检查更新后的答案。我准备下注25比1就是这样。 – 2012-02-19 23:43:54

回答

5

旧文档字符串为scipy.special.zeta说:

y=zeta(x,q) returns the Riemann zeta function of two arguments: 
sum((k+q)**(-x),k=0..inf) 

根据维基百科文章,这是赫尔维茨zeta函数“它与黎曼ζ函数一致时Q = 1”(未q = 0)。事实上它:

In [3]: zeta(1.5, 1) 
Out[3]: 2.6123753486854882 

In [4]: zeta(2, 1) 
Out[4]: 1.6449340668482266 

In [5]: zeta(3, 1) 
Out[5]: 1.202056903159594 

In [6]: zeta(4,1) 
Out[6]: 1.0823232337111381 

In [7]: np.pi**4/90 
Out[7]: 1.082323233711138 

更新:文档字符串现在明确地说:“这两个参数版本是赫尔维茨zeta函数”和“黎曼ζ函数对应Q = 1”。

+0

我今天早上最终意识到这一点,感谢您将它写入答案。 – 2012-02-20 22:33:31

1
#!/usr/bin/python 
import numpy as np 

def mzeta(x,q,N=100): 
    s=0 
    for j in np.arange(1,N): 
    s+= 1./(1.*j+1.*q)**x 
    return s 


for N in [100, 500, 1000, 5000, 15000]: 
    print mzeta(2.,0.,N), np.pi**2/ 6 

产生

[email protected]:~/sweethome/temp$ ./mzeta.py 
1.63488390018 1.64493406685 
1.64293206551 1.64493406685 
1.64393356668 1.64493406685 
1.64473404685 1.64493406685 
1.64486739796 1.64493406685 

注意求和这里从1

UPD开始:的确,这似乎是在总和j=0值:

print "*****" 
x, q=2, 0.1 
print mzeta(x,q,10000) + 1./q**x, zeta(x,q) 

这给出

***** 
101.433199147 101.433299151 
+0

谢谢你的敏锐观察。 – 2012-02-19 23:53:33

+0

我不确定我是否按照你的帖子,但我想我会问你在发布已解决的问题之前:zeta函数将复数作为参数。从所有事情看来,处理'scipy.special'中'zeta'函数的方法是通过为第二个参数'zeta(。,1)'插入'1',但是如何插入复数? – Toni 2017-06-12 16:26:56