3

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

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 
+0

另外[上math.SE](http://math.stackexchange.com/q/79218/954)和[超级]相关的问题(http://superuser.com/q /45585分之315337)。 – Simon

回答

2

如果有人通过首先扩展矩阵元素来集成一点,那么通过一点努力就可以实现。

在带有Windows和Mathematica 8.0.4的四核笔记本电脑上,以下代码在大约13分钟内针对DIM = 200提问 , 针对DIM = 50代码以6秒运行。


$starttime = AbsoluteTime[]; Quiet[LaunchKernels[]]; 
DIM = 200; 
Print["$Version = ", $Version, " ||| ", "Number of Kernels : ", Length[Kernels[]]]; 
f[r_] := f[r] = Sum[(((-1)^n*(-(2*n) + 2*r - 7)!!)*x^(-(2*n) + r - 1))/(2^n*n!*(-(2*n) + r - 1)!), {n, 0, r/2}]; 
Nw = Transpose[Table[f[j], {i, 1}, {j, 5, DIM, 1}]]; 
nw2 = Nw . Transpose[Nw]; 
Print["Seconds for expanding Nw.Transpose[Nm] ", Round[First[AbsoluteTiming[nw3 = ParallelMap[Expand, nw2]; ]]]]; 
Print["do the integral once: ", Integrate[x^n, {x, -1, 1}, Assumptions -> n > -1]]; 
Print["the integration can be written as a simple rule: ", intrule = (pol_Plus)?(PolynomialQ[#1, x] &) :> 
    (Select[pol, !FreeQ[#1, x] & ] /. x^(n_.) /; n > -1 :> ((-1)^n + 1)/(n + 1)) + 2*(pol /. x -> 0)]; 
Print["Seconds for integrating Nw.Transpose[Nw] : ", Round[First[AbsoluteTiming[X1 = ParallelTable[row /. intrule, {row, nw3}]; ]]]]; 
Print["expanding: ", Round[First[AbsoluteTiming[preY1 = ParallelMap[Expand, D[Nw, {x, 2}] . Transpose[D[Nw, {x, 2}]]]; ]]]]; 
Print["Seconds for integrating : ", Round[First[AbsoluteTiming[Y1 = ParallelTable[py /. intrule, {py, preY1}]; ]]]]; 
Print["X1 = ", (Shallow[#1, {4, 4}] &)[X1]]; 
Print["Y1 = ", (Shallow[#1, {4, 4}] &)[Y1]]; 
Print["seq Y1 : ", Simplify[FindSequenceFunction[Diagonal[Y1], n]]]; 
Print["seq X1 0 : ",Simplify[FindSequenceFunction[Diagonal[X1, 0], n]]]; 
Print["seq X1 2: ",Simplify[FindSequenceFunction[Diagonal[X1, 2], n]]]; 
Print["seq X1 4: ",Simplify[FindSequenceFunction[Diagonal[X1, 4], n]]]; 
Print["overall time needed in seconds: ", Round[AbsoluteTime[] - $starttime]]; 
+0

尊敬的Rolf先生如果我需要两个积分X1 = a * Integrate [Nw。移调[Nw],{x,-1,0.3}] + b *积分[Nw。转置[Nw],{x,0.3,1}]; a和b常量。非常感谢你在这个细节类型。人们应该向你学习如何提供解决方案。非常感谢你。 –

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 *) 

在我的时机,与{j, 5, 30, 1},而不是{j, 5, 200, 1}限制有些使用的时间,这在我的核心上快了约3.4倍。但它可以更快完成具有:

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

X2par == X1par == X1 

(* ===> True *) 

这是快约6.8倍,其中2.3的一个因素是由于Parallelize

TimingAbsoluteTiming当涉及并行执行时不是非常值得信赖。我在每行之前和之后使用了AbsoluteTime并采取了区别。


编辑

我们不应该忘记ParallelMap:

在粗糙列表级别(1):

ParallelMap[Integrate[#, {x, -1, 1}] &, Nw.Transpose[Nw], {1}] 

在最深处列表级别(最细粒度平行化):

ParallelMap[Integrate[#, {x, -1, 1}] &, Nw.Transpose[Nw], {2}] 
+0

使用公式 的简化形式是否可能更快f [r_] = FullSimplify Sum [((( - 1)^ n *(2 * r-2 * n-7)!!)/(2^(r-2 * n-1),{n,0,r/2}],r> 0 && r'[元素]整数] 简化为 $$ f(r)= - \ frac {\ sqrt {\ pi}(-1)^ r 2^{r-3} x^{r-1} \,_2 \代字号{F} _1 \左(\压裂{1-R} {2},1- \压裂{R} {2}; \压裂{7} {2} -r; \压裂{1} {X^2 } \ right)} {\ Gamma(r)}。 $$ 但它不适用于此公式 f [r_]:= - (1/Gamma [r])(-1)^ r 2 ^( - 3 + r)Sqrt [ (1-r)/ 2,1-r/2,7/2-r, 1/[n + 2] –

+2

@Sjoerd你的10K派对即将来临!你买了足够的啤酒吗? –

+0

@George在您的评论中提到的函数Sqrt [?]应该是Sqrt [Pi]并且[Xi]应该是\ [Xi]。如果你定义Xi,它也可以加快速度。在这种情况下,只有并行化的开销似乎压倒了并行化带来的任何收益。不知道为什么这是如此 –