如何在Mathematica中并行化集成8

Geo*_*lls 3 parallel-processing wolfram-mathematica numerical-methods

有人知道如何使用所有内核来计算集成?我需要使用并行化或并行表,但如何?

 f[r_] := Sum[(((-1)^n*(2*r - 2*n - 7)!!)/(2^n*n!*(r - 2*n - 1)!))*
 x^(r - 2*n - 1), {n, 0, r/2}]; 


 Nw := Transpose[Table[f[j], {i, 1}, {j, 5, 200, 1}]]; 

 X1 = Integrate[Nw . Transpose[Nw], {x, -1, 1}]; 

 Y1 = Integrate[D[Nw, {x, 2}] . Transpose[D[Nw, {x, 2}]], {x, -1, 1}]; 

 X1//MatrixForm
 Y1//MatrixForm
Run Code Online (Sandbox Code Playgroud)

Sjo*_*ies 8

我将列表的集成更改为集成列表,以便我可以使用ParallelTable:

X1par=ParallelTable[Integrate[i, {x, -1, 1}], {i, Nw.Transpose[Nw]}];

X1par==X1

(* ===> True *)

Y1par = ParallelTable[Integrate[i,{x,-1,1}],{i,D[Nw,{x,2}].Transpose[D[Nw,{x,2}]]}]

Y1 == Y1par

(* ===> True *)
Run Code Online (Sandbox Code Playgroud)

在我的时间里,{j, 5, 30, 1}不是{j, 5, 200, 1}限制使用的时间,而是在我的quod-core上快了大约3.4倍.但它可以更快地完成:

X2par = Parallelize[Integrate[#, {x, -1, 1}] & /@ (Nw.Transpose[Nw])]

X2par == X1par == X1

(* ===> True *)
Run Code Online (Sandbox Code Playgroud)

这大约快了6.8倍,其中2.3倍是由于Parallelize.

TimingAbsoluteTiming不是在并行执行而言非常值得信赖.我AbsoluteTime在每一行之前和之后使用并采取了差异.


编辑

我们不应该忘记ParallelMap:

在最粗略的列表级别(1):

ParallelMap[Integrate[#, {x, -1, 1}] &, Nw.Transpose[Nw], {1}]  
Run Code Online (Sandbox Code Playgroud)

在最深的列表级别(最精细的并行化):

ParallelMap[Integrate[#, {x, -1, 1}] &, Nw.Transpose[Nw], {2}]
Run Code Online (Sandbox Code Playgroud)

  • @Sjoerd你的10K派对即将到来!你买了足够的啤酒吗? (2认同)