今天我們來講一節數學課:蒙特卡洛積分
一般在工程實踐中,面對的函數千變萬化,我們很難直接計算得出某個函數的積分的解析解。為了求解函數積分的數值解,蒙特卡洛法是一種強大的積分方法。它的推導過程如下:
假設我們想去求得函數g的積分,首先根據大數定理,任意給定一個實數函數f和隨機變量x~p(x),可以得到:
令g=fp,代換上式可得:
它的期望值為:
也就是說,當N取的足夠大時,結果將無限逼近解析積分。
綜上所述,蒙特卡洛方法是一種可以近似計算任意函數積分的數值方法。它的計算分為以下步驟:
1.對一個滿足某種概率分布的隨機數進行抽樣
2.使用該抽樣計算g(x)/p(x)的值,作為樣本
3.最后對所有的樣本累加求平均
寫了一段代碼來驗證一下sin(x)在[0,pi]區間的積分,采用均勻分布:
import random
import math
count = 10000
sum = 0.0
pi = 3.14159265
for i in xrange(count):
p = 1.0 / pi
x = random.uniform(0.0, pi)
sum += math.sin(x)/p
sum /= count
print sum
print math.cos(0) - math.cos(pi)
解析解為2,數值解為1.98730395714,可以說是很接近了。
用蒙特卡洛積分法求積分涉及到兩個問題:1.如何對一個任意分布函數進行抽樣; 2.如何減少方差,我們之后會對它進一步探討。