2011年6月28日 星期二

[自動轉寄] (kichigop) Compute PI Using A Monte Carlo

作者: chungyuandye (養花種魚數月亮賞星星)
標題: Compute PI Using A Monte Carlo
時間: Tue Jun 28 19:12:06 2011

一些平行運算程式的使用方法我在blog裡面都有提到,
有興趣的話可以到我blog留言討論,

以下是使用Mathematica 8.0


N[Pi,100]

(* 定義距離原點的半徑函數 *)
r[x_, y_] = Sqrt[x^2 + y^2];

(*產生10000的隨機樣本點*)
dataset = RandomReal[{0, 1}, {10000, 2}];

(*繪初樣本點與1/4圓*)
Show[ListPlot[dataset, AspectRatio -> 1],
Plot[Sqrt[1 - x^2], {x, 0, 1}, PlotStyle -> {Thickness[0.01], Red}]]

(*將半徑內與半徑玩的點畫出*)
ListPlot[{Select[dataset, r @@ # < 1 &],
Select[dataset, r @@ # >= 1 &]}, PlotStyle -> {{Red}, {Blue}},
AspectRatio -> 1]

(* 模擬一組樣本數為n時估計的pi *)
sim[ntemp_] := With[{n = ntemp},
(*將函數r分配給各核心*)
DistributeDefinitions[r];
N@Total@ParallelMap[If[r[#[[1]], #[[2]]] <= 1, 1, 0] &,
RandomReal[{0, 1}, {n, 2}]]/n*4
]


sim[10000]

(* 實驗重複1000次,並畫出直芳荼*)
Histogram[sim[1000] & /@ Range[100]]

(* 建立樣本數為n時,所得到pi的函數 *)
size[ntemp_Integer] := Block[{n = ntemp, data},
data = RandomReal[{0, 1}, {n, 2}];
N@Total@Map[If[r[#[[1]], #[[2]]] <= 1, 1, 0] &, data]/n*4
];

(*將函數size分配給各核心*)
DistributeDefinitions[size];
(*不使用平行運算*)
Map[size, Range[10000, 100000, 1000]] // AbsoluteTiming
(*使用平行運算*)
ParallelMap[size, Range[10000, 100000, 1000]] // AbsoluteTiming

--
養花種魚數月亮賞星星

http://chungyuandye.twbbs.org


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.232.166.217

沒有留言:

張貼留言