蒙特卡羅求面積問題
1、簡介
通常蒙特卡羅方法可以粗略地分成兩類:一類是所求解的問題本身具有內在的隨機性,藉助計算機的運算能力可以直接模擬這種隨機的過程。例如在覈物理研究中,分析中子在反應堆中的傳輸過程。中子與原子核作用受到量子力學規律的制約,人們只能知道它們相互作用發生的概率,卻無法準確獲得中子與原子核作用時的位置以及裂變產生的新中子的行進速率和方向。科學家依據其概率進行隨機抽樣得到裂變位置、速度和方向,這樣模擬大量中子的行爲後,經過統計就能獲得中子傳輸的範圍,作爲反應堆設計的依據。
另一種類型是所求解問題可以轉化爲某種隨機分佈的特徵數,比如隨機事件出現的概率,或者隨機變量的期望值。通過隨機抽樣的方法,以隨機事件出現的頻率估計其概率,或者以抽樣的數字特徵估算隨機變量的數字特徵,並將其作爲問題的解。這種方法多用於求解複雜的多維積分問題。
假設我們要計算一個不規則圖形的面積,那麼圖形的不規則程度和分析性計算(比如,積分)的複雜程度是成正比的。蒙特卡羅方法基於這樣的思想:假想你有一袋豆子,把豆子均勻地朝這個圖形上撒,然後數這個圖形之中有多少顆豆子,這個豆子的數目就是圖形的面積。當你的豆子越小,撒的越多的時候,結果就越精確。藉助計算機程序可以生成大量均勻分佈座標點,然後統計出圖形內的點數,通過它們佔總點數的比例和座標點生成範圍的面積就可以求出圖形面積。
2、問題
求拋物線 y = x*x 在第一象限、區間0≤x≤1上的面積。
3、全部代碼
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc<1)
return 0;
long total, inside, i;
float x,y;
total=atoi(argv[1]); //在Linux下運行
//scanf("%ld",&total);
inside=0;
for (i = 0; i <total ; ++i) {
x=drand48();
y=drand48();
if (y<x*x)
inside++;
}
printf("%f\n",1.0*inside/total);
}
5、相關文件:Github