萬物拓展在新江灣城開設的線下小班課,是以少兒編程課為核心,融合了計算機、天文、地理和物理等多種學科的綜合性課程。
萬物所有課程的設計都講求拓展和互聯,尤其是與校內基礎學科的融合,Python編程亦是如此。
神奇的π眾所周知,圓周率π是⼀個圓的周⻓與直徑之⽐,⽽且不論圓的⼤⼩,這個⽐值是常數,永遠不變。圓周率的近似值 π ≈ 3.14 家喻戶曉,關於它的⽂章和書籍更是多不勝數。
講故事才是激發興趣的第一要素3月14日, π 日, 偉大的科學家愛因斯坦在這一天出生,另一位偉大的物理學家霍金在這一天離世。廣闊的宇宙像pai一樣無限。
兩位偉人生於凡塵,歸於群星。
我國數學家華羅庚,寫過一本數學小冊子《從祖衝之的圓周率談起》,其中有一個故事:從前有個教書先生,平日喜歡喝酒。一天,他把學生們關在教室裡,要他們背誦圓周率,自己卻提了一壺酒到山上的寺廟找老和尚對飲去了。先生回來後,考問學生有沒有把圓周率背下來。有個學生就回應道:「山巔一寺一壺酒,爾樂苦煞吾, 把酒吃,酒殺爾殺不死,樂爾樂」。
先生開始很生氣,以為學生是在諷刺他,但很快便意識到這其實是帶濃厚鄉音的普通話 3.1415926535897932384626,頓時轉怒為喜,把這個學生著實稱讚了一番。
π 值計算史「誰能把π算的更多位,誰就更厲害」,這揭開了π值計算史。
最先對 π 值進行系統嚴格的估算者應當首推古希臘科學家阿基米德(公元前 287—前 212 年),他得出不等式 3 + 10/71 < π < 3 + 1/7,平均值就是 π ≈ 3.14 · · ·
在我國,三國後期魏國人劉徽(生於公元 250 年左右)留下了寶貴的數學遺產《九章算術注》和《海島算經》,並創始和使用了「割圓術」,即用圓的內接和外切正多邊形來逼近圓的周長。
割圓術為後來南北朝時期數學家祖衝之(公元 429—500 年)的估算 3.1415926 < π < 3.1415927 提供了最基本的方法。此外,祖衝之還以很簡單的分數形式給出了圓周率的約率 π ≈ 22/7 和密率 π ≈ 355/113。
古人計算圓周率,一般都是用正多邊形來逼近圓的。阿基米德用正 96 邊形逼近圓而得到 π 小數點後 3 位的精度,劉徽用正 3072 邊形逼近圓也只能得到 π 小數點後 5 位的精度。
由於這些計算方法的效率極低,估算 π 的歷史進程十分緩慢。直到微積分問世以後,情況才大為改觀。
1706 年,英國天文學家 John Machin 發現了一個簡單的解析公式,並用它計算 π 達到了小數點後 100 位的精確度。
π = 16 arctan(1/5) − 4 arctan(1/239)。
微積分的出現,不但給出了許多關於 π 的解析估計,更大大地加快了其數值計算。且不說優雅漂亮的 Gregory-Leibniz 和差公式
1/1 − 1/3 + 1/5 − 1/7 + 1/9 − · · · = π/4
以及 Wallis 乘積公式
2/1 × 2/3 × 4/3 × 4/5 × 6/5 × 6/7 × 8/7 × 8/9 × · · · = π/2 ,
後來發現能夠用來對 π 作快速近似計算的公式還有很多。
1914 年,自學成才的傳奇印度數學家拉馬努金就曾經寫下過 14 個關於 π 的無窮級數展開公式。
電子計算機出現以後,人類大規模、高精度的計算能力得到了無與倫比的飛躍,使得圓周率計算的進程突飛猛進,實現了計算 π 的(二進位)數字長度一次又一次重大突破。
1985 年,美國數學家 Bill Gosper 用拉馬努金的一個公式計算圓周率精確到了小數點後 17500000 位。
1994 年,蘇聯裔美國數學家 David 和 Gregory Chudnovsky1994 年,蘇聯裔美國數學家 David 和 Gregory Chudnovsky 兄弟在同一個公式的基礎上計算 π 到了 4044000000 位。
1995 年以後,日本數學家金田康正及其團隊更在世界上遙遙領先,在 2003 年把對 π 的 計算提高到了 1.24 萬億位。
2010年1月, 法國程式設計師 Fabrice Bellard上面的紀錄在 2010 年 1 月 8 日由法國一位程式設計師 Fabrice Bellard 打破。他改進了 Chudnovsky 兄弟的公式,用了 131 天在一部臺式計算機上成功地把 π 計算到 2.7 萬億位。
這個數字有多長呢?如果你平均用一秒鐘來報出一個數字的話,那麼需要 8.5 萬年才能讀完它的所有數字。
可是,這個世界紀錄到 8 月份又被打破了,日本工程師近藤茂與美國西北大學計算機系的香港學生餘智恆合作,把 π 值算到了 5 萬億位。
誰知道,當歡呼聲猶在耳際,9 月 17 日英國 BBC 又作出了驚人的報導,說雅虎科技公司的研究員、原香港科技大學畢業生施子和採用「雲計算」技術,利用 1000 臺計算機同時計算,歷時 23 天,將 π 計算到小數點後 2 千萬億位,為 8 個月前法國人 Bellard 記錄的近一千倍。
這可不是只增加了大約一千個數位,而是由一千個、每個都有 2.7 萬億位長的數字連接起來。施子和興奮無比地向全世界宣布了他的計算結果,還說他發現了「π 的小數點後第兩千兆位是 0!」
你能記住 π 小數點後多少位?你或許不以為然,說用計算機來計算π不足為奇。那麼,用人腦進行計算和記憶就不容易了吧?如果我告訴你,有人能正確無誤地記住 π 的數值從 3.14 開始一直到小數點後幾萬位數字,你會覺得匪夷所思吧?
其實,多少年來一直有憑人腦記憶背誦 π 數值的金氏世界紀錄,目前領先的是中國人呂超。2005年11月20日,當時是西北農林科技大學研究生的呂超用了24小時零 4分的時間,連續背誦出 π 值到小數點後67890位。
讀到這裡,你如果不是數學粉絲的話其實並不會特別激動:知道 π ≈ 3.14 就已經足夠了,誰去關心它長長尾巴上的無窮多位數字呢?
說來也是,造物主有這麼多東西可以創造,為什麼偏偏造出這個神奇的 π 來,讓許許多多的數學家和粉絲們兩千多年來嘔心瀝血地去追尋不休呢?
其實,造物主並不是一些人所想像得那麼無聊。
無處不在的神奇數字你可能早已聽說過,π 與地球上的許多河流有關:河流彎曲河道的曲線長度與河道首尾直線距離之比通常都接近於 3.14 —— 河道越是蜿蜒曲折,這個近似值就越好——亞馬遜河便是一個例子。
最令人驚嘆的是 2010 年11月《科學》雜誌上報導的,德國哥廷根大學馬克 · 普朗克動力學與自組織科學研究所和伯恩斯坦計算神經科學研究中心的科學家 Matthias Kaschube 及其團隊的一項研究成果。研究人員發現,相同哺乳類中的三種遠親動物嬰猴、 樹鼩和蒙眼貂的大腦中,它們視覺皮層的螺旋結構平均分布密度都是一樣的,而且都落在 π 值 3.14 的 95% 置信區間之中。
真的?這不會是巧合吧?雖然這個 3.14 不能與用計算機得到的兩千萬億位數字相提並論,但對於理論生物學家來說,3.14 已經是一個令他們難以置信的超級精確度了。
科學家們相信,今天的生物大腦都是經過漫長時間通過自組織演化過程而逐漸形成的,並且都具有某種最優的結構和功能。
如果是這樣的話,那些哺乳類動物大腦視覺皮層中基本螺旋結構分布都不約而同地呈現出以 3.14 為平均密度之特徵,是不是自然進化的最優結果呢?不會是造物主在創世開始時,不經意地在它們的大腦中寫下了那個神奇的數字 π 吧?
計算圓周率的方法1--蒙特卡羅的方法利用蒙特卡羅分析法可用於估算圓周率,如圖,在邊長為 2 的正方形內作一個半徑為 1 的圓,正方形的面積等於 2×2=4,圓的面積等於 π×1×1=π,由此可得出,正方形的面積與圓形的面積的比值為 4:π圓和正方形的面積比是:現在讓我們用電腦生成若干組均勻分布於 0-2 之間的隨機數,作為某一點的坐標散布於正方形內,那麼落在正方形內的點數 N 與落在圓形內的點數 K 的比值接近於正方形的面積與圓的面積的比值,即,N:K ≈ 4:π,因此,π ≈ 4K/N 。(K是在圓內的,N是總的)
import random
num_all = 0 #隨機點總計數器
num_cir = 0 #隨機點在圓內的計數器
num_halt = 10000000 #每產生10,000,000個隨機點後,計算並列印一次目前的結果
print("將進行無限計算,請用Ctrl_C或其他方式強制退出!!!")
input("按回車(Enter)鍵開始...")
print("開始計算...,退出請用Ctrl_C或其他強制退出方式...")
print("\n實驗次數 計算結果")
while 1 :
for i in range(num_halt):
x = random.random() #獲得隨機點的橫坐標
y = random.random() #獲得隨機點的縱坐標
if x*x + y*y < 1 : #隨機點(x,y)在圓內
num_cir = num_cir + 1 #圓內計數器+1
num_all = num_all + 1 #總計數器+1
pi = 4*num_cir/num_all
print(num_all," ", pi)
現在我們用劉徽和祖衝之的割圓術試試。
割之彌細,所失彌少。割之又割,以至於不可割,則與圓周合體而無所失矣。
與阿基米德相似,劉徽也是從正六邊形開始計算的。不同的是,劉徽以面積來計算,他通過分割圓為192邊形,計算出圓周率在3.141024與3.142704之間,取其近似值157/50。
原理是這樣的:設想一個圓,半徑r=1,內接一個正n邊形,邊長為a,那麼當這個多邊形的邊數n越大,它的周長就越接近圓的周長。所以我們就可以用多邊形的周長代替圓的周長並應用圓的周長公式得到:
公式圓的內接正n邊形邊長a可以迭代計算:
公式我們從正六邊形開始,它的邊長a=r=1,然後計算正12邊形、正24邊形、正48邊形...逐漸逼近圓。
# 因為計算機精度原因,64位機算到49512邊形就無法繼續提高計算結果的精度了
import math
n=6
a=1
print("%-15s%-20s" % ("內接正n邊形","π計算結果"))
print("%-20d%-20.12f" % (n, n*a/2))
for i in range(100) :
n=2*n
a=math.sqrt(2-2*math.sqrt(1-(a/2)**2))
print("%-20d%-20.12f" % (n, n*a/2))
思考:為什麼後面的值是0?????
3、梅欽級數法:不直觀但也易懂,效率超高大Boss梅欽(John Machin)用他的神奇公式親手把π算到了小數點後100位,今天,我們藉助Python編程,可以遠遠超過這個精度。
梅欽公式:
公式數學上可以進行級數展開,我們表示為:
公式為了能做到高精度快速計算,我們把所有的級數都變成整數運算,因此,如果我們希望計算到π的小數點後面n位,就在上述公式兩邊乘以10的n次方,並全部運行整除運算(運算符號是「//」)。最後我們得到的一個π乘以10^n所形成的一個巨大的整數來表示計算結果(如果需要,可以通過字符變換把小數點加回去,這裡就略過了)。
基於這樣的思路,我們的代碼是:
n = int(input("請輸入想要計算到小數點後的位數:")) #輸入字符轉換為整數
t = n+10 #多計算10位,防止尾數取捨的影響
b = 10**t #為算到小數點後t位,兩邊乘以10^t
x1 = b*4//5 #取整求含4/5的首項
x2 = b // -239 #取整求含1/239的首項
s = x1+x2 #求第一大項
n *= 2 #設置下面循環的終點,即共計算n項
for i in range(3, n, 2): #循環初值=3,末值n,步長=2
x1 //= -25 #取整求每個含1/5的項及符號
x2 //= -57121 #取整求每個含1/239的項及符號
x = (x1+x2) // i #求兩項之和,除以對應因子,取整
s += x #求總和
pai = s*4 #求出π
pai //= 10**10 #舍掉後十位
print(pai) #輸出圓周率π的值,不帶小數點
請運行,然後,請你大膽輸入10000,就是說要精確到10000位!
激動人心的時刻到了,不出意外的話,幾秒鐘就出結果,一萬位的π出爐了!
python 對於科學計算有著天然的優勢這得益於Python對數學計算的支持,還有很多數學計算的公式可以直接在python的數學庫中找到,並直接使用。
在π的計算中,整數的處理方式,它能處理的整數大小不取決於寄存器大小(例如64位機=8B),而是取決於可用內存的大小(例如8GB,當然系統可能不會給用這麼多,但就算給你8MB就非常厲害了),所以能計算的整數是非常非常大的。
如果你願意等,也可以試試5萬位、10萬位、20萬位,時間會長一些,但現在的家用電腦一般也能算得出來!
若你想要嘗試100萬位,就不敢保證了,請做好死機的準備。
上課地點:橡樹灣小區或老師上門授課。
歡迎掃碼添加老師微信號(Zhaojz9687)。
[新江灣城萬物課]萬物少兒編程課體系介紹