蒙特卡洛


簡述

  蒙特卡羅方法又稱隨機抽樣技巧或統計試驗方法。半個多世紀以來,由於科學技術的發展和電子計算機的發明 ,這種方法作為一種獨立的方法被提出來,並首先在核武器的試驗與研制中得到了應用。蒙特卡羅方法是一種計算方法,但與一般數值計算方法有很大區別。它是以概率統計理論為基礎的一種方法。由於蒙特卡羅方法能夠比較逼真地描述事物的特點及物理實驗過程,解決一些數值方法難以解決的問題,因而該方法的應用領域日趨廣泛。

基本思想

  當所求問題的解是某個事件的概率,或者是某個隨機變量的數學期望,或者是與概率、數學期望有關的量時,通過某種試驗的方法,得出該事件發生的頻率,或者該隨機變量若干個具體觀察值的算術平均值,通過它得到問題的解。這就是蒙特卡羅方法的基本思想。

因此,可以通俗地說,蒙特卡羅方法是用隨機試驗的方法計算積分,即將所要計算的積分看作服從某種分布密度函數f(r)的隨機變量g(r)的數學期望

                       

通過某種試驗,得到N個觀察值r1,r2,…,rN(用概率語言來說,從分布密度函數f(r)中抽取N個子樣r1,r2,…,rN,),將相應的N個隨機變量的值g(r1),g(r2),…,g(rN)的算術平均值 作為積分的估計值(近似值)。

                        

優點 能夠比較逼真地描述具有隨機性質的事物的特點及物理實驗過程。 受幾何條件限制小。 收斂速度與問題的維數無關。 具有同時計算多個方案與多個未知量的能力。 誤差容易確定。 程序結構簡單,易於實現。

缺點 收斂速度慢。 誤差具有概率性。 在粒子輸運問題中,計算結果與系統大小有關。

實例

蒲豐投針

  設針投到地面上的位置可以用一組參數(x,θ)來描述,x為針中心的坐標,θ為針與平行線的夾角,如圖所示。 任意投針,就是意味着x與θ都是任意取的,但x的范圍限於[0,a],夾角θ的范圍限於[0,π]。在此情況下,針與平行線相交的數學條件是

       

 

x在[0,a]上任意取值,表示x在[0,a]上是均勻分布的,其分布密度函數為:

 

類似地,θ的分布密度函數為:

 eg:用蒲豐投針法在計算機上計算π值,取a=4、l=3。

%clear;clc;
N=10000;a=4;l=3;counter=0;
Rand1=unifrnd(0,a,1,N);%產生n個(0,a)之間均勻分布bai的隨機數,du這里a/2是投針的中點到最近的平行線的距離
Rand2=unifrnd(0,pi,1,N);% 產生n個(0,pi)之間均勻分布的隨機數,這里pi是投針到最近的平行線的角度
for i=1:N
    if Rand1(i)<l*sin(Rand2(i))
        counter=counter+1;
    end
end
frequency=counter/N;
PI=2*l/(a*frequency)

 

 eg:求連續擲兩顆骰子,點數之和大於6且第一次擲出的點數大於第二次擲出點數的概率。

理論計算為9/36。

clear;clc;
N=1000000;counter=0;
Rand1=unidrnd(6,1,N);
Rand2=unidrnd(6,1,N);
for i=1:N
    if (Rand1(i)+Rand2(i))>6 && Rand1(i)>Rand2(i)
        counter=counter+1;
    end
end
frequency=counter/N

結果為0.2508。與理論非常相近。

eg:

在我方某前沿防守地域,敵人以一個炮排(含兩門火炮)為單位對我方進行干擾和破壞.為躲避我方打擊,敵方對其陣地進行了偽裝並經常變換射擊地點.經過長期觀察發現,我方指揮所對敵方目標的指示有50%是准確的,而我方火力單位,在指示正確時,有1/3的射擊效果能毀傷敵人一門火炮,有1/6的射擊效果能全部毀傷敵人火炮.現在希望能用某種方式把我方將要對敵人實施的次打擊結果顯現出來,確定有效射擊的比率及毀傷敵方火炮的平均值。使用蒙特卡洛方法模擬次打擊結果:

function [out1,out2,out3,out4] = Msc(N)
%UNTITLED8 此處顯示有關此函數的摘要
%   此處顯示詳細說明
k1=0;k2=0;k3=0;
for i=1:N
    x0=randperm(2)-1;
    y0=x0(1);
    if y0==1
        fprintf('第%d次:指示正確||',i);
        x1=randperm(6);
        y1=x1(1);
        if y1==1||y1==2||y1==3
            fprintf('第%d次:擊中0炮||',i);
            k1=k1+1;
        else
            if y1==4||y1==5
                fprintf('第%d次:擊中1炮||',i);
                k2=k2+1;
            else
                fprintf('第%d次:擊中2炮||',i);
                k3=k3+1;
            end
        end
    else
        fprintf('第%d次:指示錯誤,擊中0炮||',i);
    end
    fprintf('\n');
    out1=(k2+k3)/N;  %有效打擊的概率
    out2=k2/N;   %每次擊中摧毀一門火炮的概率
    out3=k3/N;     %每次擊中摧毀兩門火炮的概率
    out4=(k2+k3*2)/N;   %平均每次擊中的火炮個數
end

 

 

 

 a:有效打擊的概率  b:每次擊中摧毀一門火炮的概率   c:每次擊中摧毀兩門火炮的概率  d:平均每次擊中的火炮個數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM