作者newversion (海納百川天下歸心)
看板C_and_CPP
標題Re: [問題] 有人知道這pi公式的名字嗎?
時間Wed Dec 8 01:07:13 2010
※ 引述《DrStein (啤酒肚)》之銘言:
: 上色版
: http://nopaste.csie.org/900f4
: #define NUM_TERM 1000
: int Serial_Pi(double *pi)
: {
: int i;
: double step, x, sum;
: sum = 0.0;
: step = 1.0/NUM_TERM;
: for(i =1; i<= NUM_TERM; i++){
: x = (i - 0.5)*step;
: sum += 4.0/(1.0 + x*x);
: }/*for i*/
: *pi = step*sum;
: return 0;
: }/*Serial_Pi*/
: 這公式很棒啊,沒有正負交替。
: 極適合平行計算。
: 收殮又快,做一千項就有小數點七位精度
: Leibniz formula做一千項才到小數點後第三位 0.0
: (或是說Leibniz要作一千兩百萬才只有他一千次的精度)
: 有人知道這公式的名字/來源或推導的嗎?
: 謝謝
看起來很像 4/(1 + x^2) 的黎曼和0到1的積分,不過不是
x = (i - 0.5)*step; 改成 x = i*step; 才是黎曼和積分
黎曼和積分的收歛速度比這個慢
用 Maple 計算結果:
n是NUM_TERM
1/n* sum(4/(((k-1/2)/n)^2 + 1), k=1..n);
得到
(-2*I*n*Psi(n+1/2-I*n)+2*I*n*Psi(n+1/2+I*n)+2*I*n*Psi(1/2-I*n)-2*I*n*Psi(1/2+I*n))/n
其中 Psi = Digamma function
http://en.wikipedia.org/wiki/Digamma_function
I=√-1
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.101.202
→ newversion:有趣的是 0.5 改成任何數字都會收歛到pi,只是速度較慢 12/08 01:45
→ newversion:目前測試似乎0.5最快 12/08 01:45
→ newversion:後來想想 0.5 改成 0至1間的數字都是黎曼積分 12/08 04:12
→ newversion:改成 100、10000等較大的數字,則是在0和1附近捨棄或增 12/08 04:16
→ newversion:加有限項的黎曼積分 12/08 04:16
→ newversion:當n->∞,這些有限項不影響最後的值。 12/08 04:18
※ 編輯: newversion 來自: 114.32.101.202 (12/08 04:19)