[心得] Compute Pi Using A Monte Carlo
看板Mathematica作者chungyuandye (養花種魚數月亮賞星星)時間13年前 (2011/06/28 19:48)推噓1(1推 0噓 0→)留言1則, 1人參與討論串1/3 (看更多)
Mathematica的parallel computing toolkit在7.0之前是要額外購買,
7.0後納入內建函數,8.0也加入GPU運算
以下是使用Mathematica 8.0,在計算時並打開
工具列=>Evolution=>Parallel kernel status
你就可以看到你電腦核心運算的狀況,
詳細的使用方式執行下列指令
?Parallelize
?ParallelMap
?ParallelTable
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[1000]]
(* 建立樣本數為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];
(* 以下針對不同的樣本數10000,11000,12000,..,100000 分別估計Pi*)
(*不使用平行運算*)
Map[size, Range[10000, 100000, 1000]] // AbsoluteTiming
(*使用平行運算*)
ParallelMap[size, Range[10000, 100000, 1000]] // AbsoluteTiming
我這台爛電腦有四個Kernel,上面的計算結果分別為40.43333秒與12.5127秒
如果你電腦有支援CUDA,不彷試試將上面ParallelMap改成CUDAMap利用GPU計算
不果要先引入CUDA套件
Needs["CUDALink`"]
--
我打研究室走過 那獨坐電腦前的容顏如苦瓜的糾結
靈感不來 長壽的煙霧不散
研究室如小小的寂寞的城 恰如商管的電梯向晚
http://chungyuandye.twbbs.org
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.232.166.217
※ 編輯: chungyuandye 來自: 118.232.166.217 (06/28 19:54)
推
06/29 06:36, , 1F
06/29 06:36, 1F
討論串 (同標題文章)
Mathematica 近期熱門文章
PTT數位生活區 即時熱門文章