標題: 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
--
養花種魚數月亮賞星星
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.232.166.217
沒有留言:
張貼留言