[心得] Compute Pi Using A Monte Carlo

看板Mathematica作者 (養花種魚數月亮賞星星)時間13年前 (2011/06/28 19:48), 編輯推噓1(100)
留言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
推!不過我是7.0 QQ雖然有支援CUDA的GPU不過不能用
06/29 06:36, 1F
文章代碼(AID): #1E2R-LQG (Mathematica)
文章代碼(AID): #1E2R-LQG (Mathematica)