国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

由Python運算π的值深入Python中科學計算的實現

2019-11-25 17:42:28
字體:
來源:轉載
供稿:網友

π是一個無數人追隨的真正的神奇數字。我不是很清楚一個永遠重復的無理數的迷人之處。在我看來,我樂于計算π,也就是計算π的值。因為π是一個無理數,它是無限的。這就意味著任何對π的計算都僅僅是個近似值。如果你計算100位,我可以計算101位并且更精確。迄今為止,有些人已經選拔出超級計算機來試圖計算最精確的π。一些極值包括 計算π的5億位。你甚至能從網上找到包含 π的一百億位的文本文件(注意啦!下載這個文件可能得花一會兒時間,并且沒法用你平時使用的記事本應用程序打開。)。對于我而言,如何用幾行簡單的Python來計算π才是我的興趣所在。
你總是可以 使用 math.pi 變量的 。它被 包含在 標準庫中, 在你試圖自己 計算它之前,你應該去使用它 。 事實上 , 我們將 用它來計算 精度 。作為 開始, 讓我們看 一個 非常直截了當的 計算Pi的 方法 。像往常一樣,我將使用Python 2.7,同樣的想法和代碼可能應用于不同的版本。我們將要使用的大部分算法來自Pi WikiPedia page并加以實現。讓我們看看下面的代碼:
 

importsysimportmath defmain(argv):   iflen(argv) !=1:    sys.exit('Usage: calc_pi.py <n>')   print'/nComputing Pi v.01/n'     a=1.0  b=1.0/math.sqrt(2)  t=1.0/4.0  p=1.0       foriinrange(int(sys.argv[1])):    at=(a+b)/2    bt=math.sqrt(a*b)    tt=t-p*(a-at)**2    pt=2*p         a=at;b=bt;t=tt;p=pt       my_pi=(a+b)**2/(4*t)  accuracy=100*(math.pi-my_pi)/my_pi       print"Pi is approximately: "+str(my_pi)  print"Accuracy with math.pi: "+str(accuracy)   if__name__=="__main__":  main(sys.argv[1:])

這是個非常簡單的腳本,你可以下載,運行,修改,和隨意分享給別人。你能夠看到類似下面的輸出結果: 

2015417113725870.png (347×591)

 你會發現,盡管 n 大于4 ,我們逼近 Pi 精度卻沒有多大的提升。 我們可以猜到即使 n的值更大,同樣的事情(pi的逼近精度沒有提升)依舊會發生。幸運的是,有不止一種方法來揭開這個謎。使用 Python Decimal (十進制)庫,我們可以就可以得到更高精度的值來逼近Pi。讓我們來看看庫函數是如何使用的。這個簡化的版本,可以得到多于11位的數字 通常情況小Python 浮點數給出的精度。下面是Python Decimal 庫中的一個例子 :

wpid-python_decimal_example-2013-05-28-12-54.png

看到這些數字。不對! 我們輸入的僅是 3.14,為什么我們得到了一些垃圾(junk)? 這是內存垃圾(memory junk)。 簡單點說,Python給你你想要的十進制數,再加上一點點額外的值。 只要精度小于垃圾數,它不會影響任何計算。通過設置getcontext().prec 你可以的到你想要的位數 。我們試試。

2015417113806473.png (480×82)

看到這些數字。不對! 我們輸入的僅是 3.14,為什么我們得到了一些垃圾(junk)? 這是內存垃圾(memory junk)。 簡單點說,Python給你你想要的十進制數,再加上一點點額外的值。 只要精度小于垃圾數,它不會影響任何計算。通過設置getcontext().prec 你可以的到你想要的位數 。我們試試。

2015417113925777.png (321×52)

很好。 現在讓我們 試著用這個 來 看看我們是否能 與我們以前的 代碼 有更好的 逼近 。 現在, 我通常 是反對 使用“ from library import * ” , 但在這種情況下, 它會 使代碼 看起來更漂亮 。
 

importsysimportmathfromdecimalimport* defmain(argv):   iflen(argv) !=1:    sys.exit('Usage: calc_pi.py <n>')   print'/nComputing Pi v.01/n'     a=Decimal(1.0)  b=Decimal(1.0/math.sqrt(2))  t=Decimal(1.0)/Decimal(4.0)  p=Decimal(1.0)       foriinrange(int(sys.argv[1])):    at=Decimal((a+b)/2)    bt=Decimal(math.sqrt(a*b))    tt=Decimal(t-p*(a-at)**2)    pt=Decimal(2*p)         a=at;b=bt;t=tt;p=pt       my_pi=(a+b)**2/(4*t)  accuracy=100*(Decimal(math.pi)-my_pi)/my_pi       print"Pi is approximately: "+str(my_pi)  print"Accuracy with math.pi: "+str(accuracy)   if__name__=="__main__":  main(sys.argv[1:])

 
輸出結果: 

2015417113950921.png (436×456)

 好了。我們更準確了,但看起來似乎有一些舍入。從n = 100和n = 1000,我們有相同的精度。現在怎么辦?好吧,現在我們來求助于公式。到目前為止,我們計算Pi的方式是通過對幾部分加在一起。我從DAN 的關于Calculating Pi 的文章中發現一些代碼。他建議我們用以下3個公式:

    Bailey

主站蜘蛛池模板: 沙湾县| 会理县| 阿坝县| 太谷县| 布尔津县| 茌平县| 泽库县| 万荣县| 新竹市| 垣曲县| 尼勒克县| 井研县| 新乡县| 广元市| 马鞍山市| 宣化县| 乳源| 中牟县| 安徽省| 中阳县| 嵩明县| 建昌县| 克拉玛依市| 科技| 肇源县| 永德县| 琼海市| 历史| 湟源县| 德钦县| 沁阳市| 宣化县| 长顺县| 钟祥市| 灵璧县| 岳普湖县| 杨浦区| 五华县| 特克斯县| 化隆| 方城县|