2012-02-19 3 views
1

SciPy документы о zeta function состояниях:SciPy дзета-функция возвращает дико большую величину

у = дзета (х, д) возвращает дзета-функции Римана двух аргументов: сумма ((к + Q) ** (х), к = 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 

Я пропустил что-то или ненавязчивую функцию дзета сломанной?

+2

Обратите внимание на суммирование на scipy странице, начиная с 0, а не 1, как обычно это определено –

+0

Это может объяснить, почему это приводит к двойному max, я рассмотрю исходный код –

+0

, чтобы проверить обновленный ответ. Я готов сделать ставку 25 к 1, это просто так. –

ответ

5

Старая строка документации для scipy.special.zeta сказал:

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

Согласно статье в Википедии, это функция Гурвица дзета «которая совпадает с дзета-функцией Римана при д = 1» (не д = 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 

Update: строка документация Теперь прямо говорит «версия два-аргумента дзета-функция Гурвица» и «дзета-функция Римана соответствует д = 1»

+0

Я понял это сегодня утром, спасибо, что написал это в ответ. –

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

Благодарим вас за внимание. –

+0

Я не уверен, что следую за вашим сообщением, но я полагаю, что задал вопрос, прежде чем публиковать уже разрешенный вопрос: функция дзета принимает сложные аргументы. Кажется, из всего сказанного, что способ обработки функции 'zeta' в' scipy.special' заключается в простом подключении '1' для второго аргумента:' zeta (., 1) ', но как вы подключаете комплексное число? – Toni

Смежные вопросы