蒙特卡羅算法(Monte Carlo method)


蒙特卡羅方法概述

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

蒙特卡羅方法的基本思想

用事件發生的“頻率”來決定事件的“概率”。高速電子計算機使得用數學方法在計算機上大量、快速地模擬這樣的試驗成為可能。

蒙特卡羅方法的基本原理

設有統計獨立的隨機變量Xi(i=1,2,3,…,k),其對應的概率密度函數分別為fx1,fx2,…,fxk,功能函數式為Z=g(x1,x2,…,xk)。

首先根據各隨機變量的相應分布,產生N組隨機數x1,x2,…,xk值,計算功能函數值 Zi=g(x1,x2,…,xk)(i=1,2,…,N),若其中有L組隨機數對應的功能函數值Zi≤0,則當N→∞時,根據伯努利大數定理正態隨機變量的特性有:結構失效概率,可靠指標。

從蒙特卡羅方法的思路可看出,該方法回避了結構可靠度分析中的數學困難,不管狀態函數是否非線性、隨機變量是否非正態,只要模擬的次數足夠多,就可得到一個比較精確的失效概率和可靠度指標。

蒙特卡羅方法分子模擬計算的步驟

蒙特卡羅方法實施步驟:

1、通過敏感性分析,確定隨機變量;

2、構造隨機變量的概率分布模型;

3、為各輸入隨機變量抽取隨機數;

4、將抽得的隨機數轉化為各輸入隨機變量的抽樣值;

5、將抽樣值組成一組項目評價基礎數據;

6、根據基礎數據計算出評價指標值;

7、整理模擬結果所得評價指標的期望值、方差、標准差和它的概率分布及累計概率,繪制累計概率分布圖,計算項目可行或不可行的概率。

蒙特卡羅方法應用

1.求π

#include <bits/stdc++.h>

#define MAX_ITERS 10000000

using namespace std;

double Rand(double L, double R)
{
    return L + (R - L) * rand() * 1.0 / RAND_MAX;
}

double GetPi()
{
    srand(time(NULL));
    int cnt = 0;
    for(int i = 0; i < MAX_ITERS; i++)
    {
        double x = Rand(-1, 1);
        double y = Rand(-1, 1);
        if(x * x + y * y <= 1)
            cnt++;
    }
    return cnt * 4.0 / MAX_ITERS;
}

int main()
{
    for(int i = 0; i < 10; i++)
        cout <<  fixed << setprecision(10)<<GetPi() << endl;
    return 0;
}

 

2.求e

#include <bits/stdc++.h>

#define MAX_ITERS 10000000

using namespace std;

struct Point
{
    double x, y;
};

double Rand(double L, double R)
{
    return L + (R - L) * rand() * 1.0 / RAND_MAX;
}

Point getPoint()
{
    Point t;
    t.x = Rand(1.0, 2.0);
    t.y = Rand(0.0, 1.0);
    return t;
}

double getResult()
{
    int m = 0;
    int n = MAX_ITERS;
    srand(time(NULL));
    for(int i = 0; i < n; i++)
    {
        Point t = getPoint();
        double res = t.x * t.y;
        if(res <= 1.0)
            m++;
    }
    return pow(2.0, 1.0 * n / m);
}

int main()
{
    for(int i = 0; i < 20; i++)
        cout << fixed << setprecision(10) << getResult() << endl;
    return 0;
}
//precision() 返回當前的浮點數精度值
//precision(val) 設置val為新的浮點數精度值, 並返回原值
//setf(flags) 添加格式標志flags, 返回所有標志的原本狀態.
//showpos    正數前面加上+號
//fixed 使用小數計數法
//scientific 使用科學計數法
//uppercase 使用大寫字符
//showbase  顯示數字的進制
//boolalpha    bool值使用字符表示 , true或者false
//noboolalpha     bool使用0和1表示
//left   靠左對齊
//right  靠右對齊
//internal 字符靠左對齊, 數字卡右對齊

 參考:

[1]http://blog.csdn.net/acdreamers/article/details/44978591

[2]MBA智庫:http://wiki.mbalib.com/wiki/%E8%92%99%E7%89%B9%E5%8D%A1%E7%BD%97%E6%96%B9%E6%B3%95


免責聲明!

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



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