蒙特卡羅方法(python實現)

蒙特卡羅方法是一種統計模擬方法,由馮·諾依曼和烏拉姆提出,在大量的隨機數下,根據機率估計結果,隨機數據越多,得到的結果越精確。下面咱們將用python實現蒙特卡羅方法。python

1.首先咱們作一個簡單的圓周率的近似計算,在這個過程當中咱們要用到隨機數,所以須要先使用import numpy as np導入numpy庫。dom

2.代碼實現:工具

import numpy as np

total = 8000000
count = 0

for i in range(total):
    x = np.random.rand()
    y = np.random.rand()
    dis = (x**2+y**2)**0.5
    if dis <= 1:
        count = count+1
PI = 4*count/total
print(PI)

3.在上面的程序中咱們用8000000個隨機數進行投放,這樣獲得的結果會更精確一些,運行程序須要必定的時間,最終獲得的結果以下編碼

在這裏插入圖片描述

4.下面咱們進行一項簡單的應用,下圖爲我在畫圖工具中隨便畫的一個圖,咱們能夠用蒙特卡羅方法來估算圖中黑色部分的面積。spa

在這裏插入圖片描述

5.上面的圖形是不規則的,咱們只需知道在投放大量隨機數的狀況下,隨機數在黑色部分出現的機率,再用總面積相乘便可估算黑色部分的面積。咱們知道,黑色的rgb編碼爲(0,0,0),因此須要統計rgb編碼爲(0,0,0)時隨機數的投放機率便可。code

6.代碼實現:圖片

from PIL import Image
import numpy as np

im = Image.open("C:/Users/21974/Desktop/handwrite2.PNG")
total = 9000000
count = 0
defin = 0
width = im.size[0]
height = im.size[1]

for i in range(total):    #用蒙特卡羅方法得到估計值
    x = np.random.randint(0, width-1)
    y = np.random.randint(0, height-1)
    k = im.getpixel((x, y))
    if k[0]+k[1]+k[2] == 0:
        count += 1
print(int(width*height*count/total))

for i in range(width):    #用遍歷得到準確值
    for j in range(height):
        k = im.getpixel((i, j))
        if k[0] + k[1] + k[2] == 0:
            defin += 1
print(defin)

上面的代碼可分爲兩部分,第一個for後面是用蒙特卡羅方法得到的面積的估計值,第二個for後面是用遍歷全部像素點的方法得到的面積的精確值,得到兩個輸出後進行對比。rem

在這裏插入圖片描述

咱們在上面的程序中採用了9000000個隨機數,能夠看出兩個輸出結果相差並不大。get

相關文章
相關標籤/搜索