【问题标题】:SciPy zeta function returns wildly large valueSciPy zeta 函数返回非常大的值
【发布时间】:2012-03-10 09:25:57
【问题描述】:

zeta function 上的 SciPy 文档声明:

y=zeta(x,q) 返回两个参数的黎曼 zeta 函数: sum((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 函数损坏了?

【问题讨论】:

  • 注意 scipy 页面上的总和从 0 开始,而不是通常定义的 1
  • 这可以解释为什么它会导致双倍最大值,我将查看源代码
  • 检查更新的答案。我已经准备好以 25 赔 1 的赔率下注了。

标签: python scipy


【解决方案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

生产

br@ratatoskr:~/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

【讨论】:

  • 感谢您的敏锐观察。
  • 我不确定我是否关注了你的帖子,但我想在发布一个已经在这里解决的问题之前我会问你:zeta 函数将复数作为参数。似乎从所有方面来看,处理scipy.special 中的zeta 函数的方法是只为第二个参数插入一个1zeta(., 1),但是你如何插入一个复数呢?
【解决方案2】:

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

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

根据维基百科的文章,这是 Hurwitz zeta 函数,“当 q = 1 时与黎曼 zeta 函数重合”(不是 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

更新:文档字符串现在明确表示“双参数版本是 Hurwitz zeta 函数”和“Riemann zeta 函数对应于 q = 1。”

【讨论】:

  • 今天早上我终于意识到了这一点,感谢您将其写成答案。
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
相关资源
最近更新 更多