用python計算圓周率Π


一、要求:

1.計算到圓周率后面越多位越好。

2.用進度條顯示計算的進度。

3.要求給出圓周率Π的具體計算方法和解釋。

二、算法:

1.拉馬努金公式:

2.高斯-勒讓德公式

設置初始值:
反復執行以下步驟直到
   
 
之間的誤差到達所需精度:
則π的近似值為:
下面給出前三個迭代結果(近似值精確到第一個錯誤的位數):
3.140...
3.14159264...
3.1415926535897932382...
該算法具有二階收斂性,本質上說就是算法每執行一步正確位數就會加倍。

3.波爾文四次迭代式

這個公式由喬納森·波爾文和彼得·波爾文於1985年發表的。

bailey-borwein-plouffe算法

這個公式簡稱BBP公式,由David Bailey, Peter Borwein和Simon Plouffe於1995年共同發表。它打破了傳統的圓周率的算法,可以計算圓周率的任意第n位,而不用計算前面的n-1位。這為圓周率的分布式計算提供了可行性。

4.丘德諾夫斯基公式

這是由丘德諾夫斯基兄弟發現的,十分適合計算機編程,是目前計算機使用較快的一個公式。

5.萊布尼茨公式

π/4=1-1/3+1/5-1/7+1/9-1/11+……

6.蒙特卡羅法(打鳥法)

一個正方形內部相切一個圓,圓和正方形的面積之比是π/4。 
這里寫圖片描述 
在這個正方形內部,隨機產生n個點(這些點服從均勻分布),計算它們與中心點的距離是否大於圓的半徑,以此判斷是否落在圓的內部。

統計圓內的點數,與n的比值乘以4,就是π的值。理論上,n越大,計算的π值越准。

三、算法實現

以下采用蒙特卡羅法(打鳥法),代碼及圖片如下。 

import math
import time
scale=10
print("執行開始")
t=time.process_time()
for i in range(scale+1):
    a,b='**'*i,'..'*(scale-i)
    c=(i/scale)*100
    π=4*(4*math.atan(1/5)-math.atan(1/239))
    print("[{}{}->%{}]".format(a,b,c))
    time.sleep(0.1)
print(π)
print("程序用時:{:.2f}s".format(t))
print("執行結束")

運行結果:

Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 22:20:52) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> 
================= RESTART: C:/Users/Benny/Desktop/打鳥法求圓周率.py =================執行開始
[....................->%0.0]
[**..................->%10.0]
[****................->%20.0]
[******..............->%30.0]
[********............->%40.0]
[**********..........->%50.0]
[************........->%60.0]
[**************......->%70.0]
[****************....->%80.0]
[******************..->%90.0]
[********************->%100.0]
3.1415926535897936
程序用時:0.11s
執行結束
>>> 

 

另外,進度條還可以用python的pip庫來實現:

 

 

 

import mathimport timescale=10print("執行開始")t=time.process_time()for i in range(scale+1):    a,b='**'*i,'..'*(scale-i)    c=(i/scale)*100    π=4*(4*math.atan(1/5)-math.atan(1/239))    print("%{:3}[{}->{}]".format(a,b,c))    time.sleep(0.1)print(π)print("{:.2f}s".format(t))print("執行結束")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM