用蒙特卡洛求pi_蒙特卡洛算法(MCS)及其MATLAB实现
基本概念
????蒙特卡洛模擬(Monte Carlo Simulation, MCS)是科學家馮·諾伊曼等人在1940年代發明的一種以概率為基礎的方法,它以一座賭城命名——蒙特卡洛。如果用一句話來概括它的本質,那么就是基于重復隨機抽樣的模擬方法,與它對應的是確定性算法。或者說,任何通過生成合適的隨機數來解決問題,并觀察遵循某些屬性的數字部分的方法都可以歸類為蒙特卡羅方法,它是一類方法而不是一種方法。
????蒙特卡羅方法基于這樣的想法:假設你有一袋豆子,把豆子均勻地朝這個圖形上撒,然后數這個圖形之中有多少顆豆子,這個豆子的數目就是圖形的面積。當你的豆子越小,撒的越多的時候,結果就越精確。借助計算機程序可以生成大量均勻分布坐標點,然后統計出圖形內的點數,通過它們占總點數的比例和坐標點生成范圍的面積就可以求出圖形面積。
(來自維基百科)
MCS求積分
????最初的蒙特卡羅方法是用來求解高維積分問題,舉一個簡單的例子,比如求下方的定積分:
????如果很難求得原函數,那用解析的方法去求定積分是非常困難的。
????針對上述積分,一個簡單的近似求解方法是在[a,b]之間隨機采樣一個點,比如x0,然后用f(x0)代表f(x)在[a,b]區間上所有的值(矩形公式),那么上面定積分的近似值便為
????顯然取一個點是不精確的,但是也沒有關系,我們可以多取一些點求平均,大數定律和中心極限定理告訴我們,當點的數量足夠多的時,會以越來越高的概率逼近真實值(期望)。
????但是上述的做法隱含了一個假設,即x在[a,b]之間是均勻分布的(在該案例求積分問題中,x在[a,b]之間確實是均勻分布的)。而大多數情況下,x在[a,b]之間不是均勻分布的,如果繼續用上面的方法,模擬求出的結果很可能和結果相差甚遠,那怎么解決這個問題呢?如果我們可以得到x在[a,b]的概率分布函數p(x),那么我們的定積分求和可以轉換為:
解釋:
*f(x)/p(x)相當于消除由于x的分布律所引起的采樣不均勻效應;
*最后一個約等號其實利用的是期望求解公式,將期望的精確值用n次觀測值的均值來代替。
????最后,如果我們采用均勻分布的p(x),那么
從而求出了定積分。
MATLAB實現MCS積分
????先看一個求積分的案例:求y=x*log(1+x)在[0 4]上的精確積分。
%% 求精確積分
close all;clc
syms x
expr = x*log(1+x);%被積函數
fplot(expr);hold on
a=0;%積分上限
b=4;%積分下限
F = double(int(expr,[a b]))
%==結果
%F = 10.0708
再利用MCS進行積分,先只進行10次采樣。
N=10;%蒙特卡洛采樣次數
SUM=0;
for i = 1:N
? ? randtemp=a+rand*(b-a);
? ? SUM=SUM+double(subs(expr,x,randtemp));
? ? %rand生成[0 1]之間均勻分布隨機數
? ? plot([randtemp randtemp],...
? ? ? ? [0 double(subs(expr,x,randtemp))],'b');
end
I=SUM/N*(b-a)
N=50;
N=1000;
????可以看到,隨著采樣次數增加,MCS的積分值越來越靠近精確值(以更高的概率靠近,而不是確定性靠近);但是MCS也有缺點,就是采樣的次數越來越多,采樣的時間也越來越長。
MATLAB求面積
????最后再來看一下MCS求重疊部分圖形面積的例子:
????此時采樣次數N=1000,求得的重疊面積為Area=0.3(紅點區域)。當增加采樣點到10000時,Area=0.3030,將越來越逼近真實值。
????以上就是蒙特卡洛的簡單介紹,你GET了嘛?兩個例子的源代碼可以后臺回復“MCS”獲取哦~
總結
以上是生活随笔為你收集整理的用蒙特卡洛求pi_蒙特卡洛算法(MCS)及其MATLAB实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】Yahoo!团队:网站性能优化的3
- 下一篇: 木马藏身于系统进程中