Python项目实践:蒙特卡罗方法计算圆周率
一、數(shù)學(xué)思維
# CalPi.py n = 100 Pi = 0 for k in range(n):Pi += 1 / pow(16, k) * (4 / (8 * k + 1) - 2 / (8 * k + 4) - 1 / (8 * k + 5) - 1 / (8 * k + 6)) print("圓周率值是:{}".format(Pi))輸出: 圓周率值是:3.141592653589793二、工程思維:蒙特卡羅方法(Monte Carlo method)
圓周率:一個(gè)與正方形內(nèi)切的圓的面積與該正方形的面積之商
πrr / 2r*2r = π/4
- 正方形的面積很好計(jì)算
- 圓的面積?
- 思考:對于一個(gè)區(qū)域面積,我們向它撒點(diǎn)或拋飛鏢或扔石子,每一個(gè)撒點(diǎn),它隨機(jī)地可能會出現(xiàn)在這個(gè)區(qū)域中的任何一個(gè)位置上。如果我們給出的這個(gè)點(diǎn)的數(shù)量非常龐大,而且每一個(gè)點(diǎn)又盡可能地隨機(jī),那么在圓的內(nèi)部的點(diǎn)就構(gòu)成了圓的面積,在整個(gè)正方形中的所有撒點(diǎn)就是正方形的面積。通過圓內(nèi)部點(diǎn)的數(shù)量與方形內(nèi)部點(diǎn)的數(shù)量的比值就能夠計(jì)算出圓周率
- 正方形內(nèi)部有一個(gè)相切的圓,它們的面積之比是π/4。現(xiàn)在,在這個(gè)正方形內(nèi)部,隨機(jī)產(chǎn)生n個(gè)點(diǎn),計(jì)算它們與中心點(diǎn)的距離,并且判斷是否落在圓的內(nèi)部。若這些點(diǎn)均勻分布,則圓周率 π/4 = count/n, 其中count表示落到圓內(nèi)投點(diǎn)數(shù) n:表示總的投點(diǎn)數(shù)。
-
數(shù)學(xué)思維的前提是需要有計(jì)算公式,如果沒有計(jì)算公式,就無法使用
-
蒙特卡羅方法是計(jì)算思維,抽象的撒點(diǎn)過程,抽象為計(jì)算點(diǎn)的數(shù)量的過程,并且用計(jì)算機(jī)通過循環(huán)自動(dòng)化運(yùn)行,抽象+自動(dòng)化
-
如果一個(gè)問題有數(shù)學(xué)公式,用公式求解更精確,但很多問題沒有數(shù)學(xué)規(guī)則,比如四色定理并不能通過數(shù)學(xué)公式來解決,也是用計(jì)算機(jī)來解決的
-
對一個(gè)程序,運(yùn)行的大部分時(shí)間只消耗在20%的代碼上,比如在循環(huán)上
三、蒙特卡洛方法的基本思想 -
通常蒙特卡羅方法可以粗略地分成兩類:**一類是所求解的問題本身具有內(nèi)在的隨機(jī)性,借助計(jì)算機(jī)的運(yùn)算能力可以直接模擬這種隨機(jī)的過程。**例如在核物理研究中,分析中子在反應(yīng)堆中的傳輸過程。中子與原子核作用受到量子力學(xué)規(guī)律的制約,人們只能知道它們相互作用發(fā)生的概率,卻無法準(zhǔn)確獲得中子與原子核作用時(shí)的位置以及裂變產(chǎn)生的新中子的行進(jìn)速率和方向。科學(xué)家依據(jù)其概率進(jìn)行隨機(jī)抽樣得到裂變位置、速度和方向,這樣模擬大量中子的行為后,經(jīng)過統(tǒng)計(jì)就能獲得中子傳輸?shù)姆秶?#xff0c;作為反應(yīng)堆設(shè)計(jì)的依據(jù)。
-
另一種類型是所求解問題可以轉(zhuǎn)化為某種隨機(jī)分布的特征數(shù),比如隨機(jī)事件出現(xiàn)的概率,或者隨機(jī)變量的期望值。通過隨機(jī)抽樣的方法,以隨機(jī)事件出現(xiàn)的頻率估計(jì)其概率,或者以抽樣的數(shù)字特征估算隨機(jī)變量的數(shù)字特征,并將其作為問題的解。這種方法多用于求解復(fù)雜的多維積分問題。
PS. source, python123.io
總結(jié)
以上是生活随笔為你收集整理的Python项目实践:蒙特卡罗方法计算圆周率的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何对K8s进行考核?Kuberheal
- 下一篇: bland c++_为什么要使用blan