2013-08-03 376 views
1

我做了詢問近似於使用萊布尼茨式的pI的值的函數的練習。這是維基百科上的解釋:

enter image description here

enter image description here

邏輯思維很容易找到我,但我沒有接受過數學正規教育,所以我對第二個代碼中最左邊的符號代表了什麼。我試圖使代碼pi = ((-1)**n/(2*n + 1)) * 4,但返回1.9999990000005e-06而不是3.14159 ......,所以我用的蓄電池模式,而不是(因爲導向的,這是一章中提到他們也一樣),它工作得很好。然而,我不禁認爲它有點人爲設計,並且可能有更好的方法來實現它,因爲Python專注於簡單性和儘可能短的程序。這是全碼:
π的萊布尼茲公式 - 這是否有益? (Python)的

def myPi(n): 
    denominator = 1 
    addto = 1 

    for i in range(n): 
     denominator = denominator + 2 
     addto = addto - (1/denominator) 
     denominator = denominator + 2 
     addto = addto + (1/denominator) 

    pi = addto * 4 

    return(pi) 

print(myPi(1000000)) 

有誰知道一個更好的功能?

+1

這代表 - *計算附着表達的總和爲n = 0到無窮大* –

+0

@RohitJain感謝您的信息! – reggaelizard

+1

你會發現最大的問題[不是算法(http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems)。 –

回答

1

這裏的資本西格瑪是sigma notation 。它是用簡潔的形式表示總和的符號。

所以,你的總和實際上是一個無限的總和。中的第一項,對於n = 0,是:

(-1)**0/(2*0+1) 

這被添加到

(-1)**1/(2*1+1) 

然後

(-1)**2/(2*2+1) 

等永遠。總和就是在數學上被稱爲收斂和

在Python你會寫這樣的:

def estimate_pi(terms): 
    result = 0.0 
    for n in range(terms): 
     result += (-1.0)**n/(2.0*n+1.0) 
    return 4*result 

如果你想優化了一下,就可以避免冪。

def estimate_pi(terms): 
    result = 0.0 
    sign = 1.0 
    for n in range(terms): 
     result += sign/(2.0*n+1.0) 
     sign = -sign 
    return 4*result 

.... 

>>> estimate_pi(100) 
3.1315929035585537 
>>> estimate_pi(1000) 
3.140592653839794 
1

使用純Python,你可以這樣做:

def term(n): 
    return ((-1.)**n/(2.*n + 1.))*4. 

def pi(nterms): 
    return sum(map(term,range(nterms))) 

,然後計算pi你需要達到給定精度的項數:

pi(100) 
# 3.13159290356 

pi(1000) 
# 3.14059265384 
4

的Leibniz公式直接轉化成Python沒有搞亂或忙亂:

>>> steps = 1000000 
>>> sum((-1.0)**n/(2.0*n+1.0) for n in reversed(range(steps))) * 4 
3.1415916535897934 
-1

以下版本使用如在this概述SO交Ramanujan的式 - 它使用pi和「怪物之間的關係組「,如this article中所討論的。

import math 

def Pi(x): 
    Pi = 0 
    Add = 0 
    for i in range(x): 
     Add =(math.factorial(4*i) * (1103 + 26390*i))/(((math.factorial(i))**4)*(396**(4*i))) 
     Pi = Pi + (((math.sqrt(8))/(9801))*Add) 
    Pi = 1/Pi 
    print(Pi) 

Pi(100) 
+1

在這裏不鼓勵使用代碼解答。請添加一些說明。 :) –