matlab蒙特卡羅方法求體積 蒙特卡羅演算法

2021-10-14 03:25:00 字數 3723 閱讀 1184

原創 袁恆

本文介紹了蒙特卡羅演算法,蒙特卡羅演算法是思想和技巧的藝術品,本文沒有演算法公式,共2000餘字,是領略演算法魅力的佳作。

在介紹蒙特卡洛演算法之前,請大家先思考乙個問題:我們從小學就知道圓的面積

一 蒙特卡羅演算法簡介蒙特·卡羅方法(monte carlo method),也稱統計模擬方法,它是一種思想或者方法的統稱,而不是嚴格意義上的演算法。蒙特卡羅方法的起源是2023年由法國數學家布豐(comte de buffon)提出的用投針實驗方法求圓周率(具體演算法見文末的好文推薦),在20世紀40年代中期,由於計算機的發明結合概率統計理論的指導,從而正式總結為一種數值計算方法,其主要是用隨機數來估算計算問題蒙特卡羅演算法基本思想

投針實驗這個例子有點晦澀,換個簡單的**並茂的例子--求圓周率。計算圓周率時可以考慮將乙個單位圓放在乙個正方形中,從而將求解圓周率轉化為計算出圓和正方形面積的比例

蒙特卡羅方法的基本思想是這樣:假想你有一袋豆子,把豆子均勻地朝這個正方形上撒,然後數落在圓內的豆子數占正方形內豆子數的比例,即可計算出圓的面積,近而計算出π。而且當豆子越小,撒的越多的時候,結果就越精確。蒙特卡羅的理論依據是概率論中的大數定律

蒙特卡羅演算法的基本步驟

蒙特卡羅演算法一般分為三個步驟,包括構造隨機的概率的過程,從構造隨機概率分布中抽樣,求解估計量。

1 構造隨機的概率過程

對於本身就具有隨機性質的問題,要正確描述和模擬這個概率過程。對於本來不是隨機性質的確定性問題,比如計算定積分,就必須事先構造乙個人為的概率過程了。它的某些引數正好是所要求問題的解,即要將不具有隨機性質的問題轉化為隨機性質的問題。如本例中求圓周率的問題,是乙個確定性的問題,需要事先構造乙個概率過程,將其轉化為隨機性問題,即豆子落在圓內的概率,而π就是所要求的解。

2 從已知概率分布抽樣

由於各種概率模型都可以看作是由各種各樣的概率分布構成的,因此產生已知概率分布的隨機變數,就成為實現蒙特卡羅方法模擬實驗的基本手段。如本例中採用的就是最簡單、最基本的(0,1)上的均勻分布,而隨機數是我們實現蒙特卡羅模擬的基本工具。

3 求解估計量

實現模擬實驗後,要確定乙個隨機變數,作為所要求問題的解,即無偏估計。建立估計量,相當於對實驗結果進行考察,從而得到問題的解。如求出的近似π就認為是一種無偏估計。

估計讀者讀完這三個帶有嚴重概率統計學的段落依舊一頭霧水,不著急,結合python例項就明白了。

二 求圓周率π的python例項演示

借助電腦程式可以生成大量均勻分布的座標點,接著統計出圖形內的點數,通過它們佔總點數的比例和座標點生成範圍的面積就可以求出的近似值。

import random

import math

import getopt

import sys

import matplotlib.pyplot as plt

def main():

total = 0

print('start experiment: ')

n = 0

#repeat try the estimate pi, until break it down manually

while true:

n=int(input(sys.ar**))

for i in range(n):

x = random.uniform(-1,1)

y = random.uniform(-1,1)

#x^2 + y^2 <=1, means (x, y) in the cycle

if math.sqrt(x ** 2 + y ** 2) <= 1.0:

total += 1

plt.plot(x, y, 'ro')

# x^2 + y^2 > 1, means (x, y) out of the cycle

else:

plt.plot(x, y, 'b*')

mypi = 4.0 * total / n

#plot the x, y and close it after 5 seconds

plt.ion()

plt.pause(5)

plt.close()

print('iteration times = ', n, 'pi estimate value = ', mypi)

print('math.pi = ', math.pi)

print('errors = ', abs(math.pi - mypi) / math.pi)

用上述**,我們用不同數量的隨機點(100,100,0,10000)來計算π。實驗結果如下。piestimate 表示估計值,errors表示與標準π的差。

100個點時:piestimate= 3.2,errors= 0.0186。

1000個點時:piestimate= 3.448,errors= 0.0975。

10000個點:piestimate= 3.486,errors= 0.110。

其優點比較明顯,尤其對於具有統計性質的問題可以直接進行解決,對於連續性的問題也不必進行離散化處理。其缺點也很顯然,對於確定性問題轉化成隨機性問題做的估值處理,喪失精確性,得到乙個接近準確的n值也不太容易。四 演算法的應用

蒙特·卡羅演算法在數學、增強學習、金融工程學,巨集觀經濟學,計算物理學等領域應用廣泛。求解積分問題

對被積分函式的變數在某一區間內進行隨機均勻抽樣,然後對抽樣點的函式值求平均,從而可以得到函式積分的近似值。此種方法的理論基礎是概率論的中心極限定理,其不隨積分維數的改變而改變。求解圓周率問題

蒙特卡羅方法可用於近似計算圓周率,如本例所示。機器學習

蒙特卡洛演算法也常用於機器學習,特別強化學習演算法。一般情況下,針對得到的樣本資料集建立相對模糊的模型,通過蒙特卡羅方法對於模型中的引數進行選取,使之於原始資料的殘差盡可能的小,從而達到建立模型擬合樣本的目的。金融領域

用隨機過程理論進行理論建模,在必要時使用蒙特卡羅演算法對模型做數值模擬,比如**未來收益和走勢,感興趣的讀者可以閱讀好文推薦的內容。當然,乙個複雜的問題不可能依靠乙個蒙特卡羅模擬就解決,需要大量的其他方法如隨機過程、機器學習相關方法、博弈論涉及的方法等。總結

蒙特卡羅演算法的應用相當廣泛,計算思想也十分簡單,這種簡單明瞭而價效比極高的演算法是數學的無窮魅力之一。不知道作為讀者的你有沒有深深的為這種數學之美和演算法之美折服?不服的讀者們請期待argo的更多篇章吧。好文推薦

蒲豐投針問題

蒙特卡羅演算法在投資理財領域的應用

參考文獻

蒙特卡羅演算法

蒙特卡羅演算法​mp.weixin.qq.com

蒙特卡羅方法求

license dingxuan technology shenzhen co.ltd date 2020 1 10 8 19 coding utf 8 project sutdy 2 filename pi test.py 蒙特卡羅方法求 1.input,輸入撒點量 2.以123作為隨機數種子,為...

MATLAB 蒙特卡羅

p rand 100000,2 兩列數,第一列為x,第二列為y,相當於100000個點 定義x y 的範圍 x 2 p 1 1 x範圍為 1到1 y 2 p 2 y範圍為0到2 找出在函式範圍的數 k find x 返回乙個包含陣列 x 中每個非零元素的線性索引的向量。如果 x 為向量,則 find...

蒙特卡羅方法

概念 蒙特卡羅方法又稱統計模擬法 隨機抽樣技術 是一種隨機模擬方法,以概率和統計理論方法為基礎的一種計算方法,是使用隨機數來解決很多計算問題的方法。將所求解的問題同一定的概率模型相聯絡,用電子計算機實現統計模擬或抽樣,以獲得問題的近似解。為象徵性地表明這一方法地概率統計特徵,故借用賭城蒙特卡羅命名。...