Parallelize の資料から、[例]> [考えられる問題] の下:
<ブロック引用>並列化できない式は通常どおり評価されます:
Parallelize[Integrate[1/(x - 1), x]]
他の質問やコメントで述べたように、 03
のようなもの と 16
並列化は非常に難しいため、Mathematica はメッセージ 24
を返します そして「逐次評価で」進みます。
(反射的には、おそらく 34
基本的に 多くの異なるルールを試してリーフカウントを行うことで機能します...)
多くの積分や単純化を行う必要がある場合は、 49
を使用できます または 57
など...
自明な例として、被積分関数がある場合
In[1]:= ints = Table[x^n, {n, 1, 10}]
Out[1]= {x, x^2, x^3, x^4, x^5, x^6, x^7, x^8, x^9, x^10}
67
を使用できます
In[2]:= ParallelTable[Integrate[int, x], {int, ints}]
Out[2]= {x^2/2, x^3/3, x^4/4, x^5/5, x^6/6, x^7/7, x^8/8,\
x^9/9, x^10/10, x^11/11}
または 75
In[3]:= ParallelMap[Integrate[#, x] &, ints]
Out[3]= {x^2/2, x^3/3, x^4/4, x^5/5, x^6/6, x^7/7, x^8/8,\
x^9/9, x^10/10, x^11/11}
明らかに、上記のような積分の小さなリストの場合、並列化のオーバーヘッドはおそらく利点よりも大きくなります。しかし、非常に大きなリストと複雑な積分がある場合は、おそらくそれだけの価値があります。
コメントに応じて編集
OP が関心を持っている非常に厄介な被積分関数を考えると (注:進むにつれて結果を単純化する必要があります!)、積分を単項式の和に分割し、 89
.
まず、pastebin から積分をインポートします
In[1]:= import = Import["http://pastebin.com/raw.php?i=JZ0CXewJ", "Text"];
統合ドメインを抽出する
In[2]:= intLimits = [email protected](2 Pi^5 ToExpression[StringReplace[import, "Integrate" -> "List"]])
vars = intLimits[[All, 1]];
Out[2]= {{\[Theta]3, 0, 2*Pi}, {\[Theta]2, 0, 2*Pi},
{\[Theta]1, 0, 2*Pi}, {\[CurlyPhi]2, 0, Pi/2}, {\[CurlyPhi]1, 0, Pi/2}}
そして被積分関数は、21 の巨大な項の合計として得られます
In[4]:= integrand = [email protected](2 Pi^5 ToExpression[StringReplace[import, "Integrate" -> "Hold"]]);
Length[integrand]
LeafCount[integrand]
Out[5]= 21
Out[6]= 48111
恐ろしい混乱を一口サイズのチャンクに分解する必要があります。まず、積分からさまざまな関数をすべて抽出します
In[7]:= (fns=Union[vars, Cases[integrand, (Cos|Sin|Tan|Sec|Csc|Cot)[x_]/;!FreeQ[x,[email protected]@vars],Infinity]])//Timing
Out[7]= {0.1,{\[Theta]1, <snip> ,Tan[\[CurlyPhi]2]}}
98
から構築された単項式の (13849 非消失) 係数を見つけます
In[8]:= coef = CoefficientRules[integrand, fns]; // Timing
[email protected]
Out[8]= {35.63, Null}
Out[9]= 13849
すべての係数に積分変数がないことを確認してください
In[10]:= FreeQ[coef[[All, 2]], [email protected]@vars]
Out[10]= True
103
を使用して実際に係数をクリーンアップできることに注意してください または 117
122
を減らします 約 5 倍...しかし、ほとんどの単項式の積分はゼロであるため、単純化を最後まで残した方がよいでしょう.
これは、単項式を再構築し、それを積分し、その係数で再結合する方法です。たとえば、40 番目の単項式は非ゼロ積分を返します:
In[11]:= monomialNum=40;
[email protected]@(fns^coef[[monomialNum,1]])
Integrate[%, [email protected]@intLimits]
coef[[monomialNum,2]] %//Factor
Out[12]= \[Theta]1 Cos[\[Theta]1]^2 Cos[\[CurlyPhi]1]^4 Cos[4 \[CurlyPhi]1] Cos[\[CurlyPhi]2]^4 Cos[2 \[CurlyPhi]2] Sin[\[Theta]1]^2
Out[13]= \[Pi]^6/256
Out[14]= -((k1^2 (k1-k2) (k1+k2) (-2+p) p^3 \[Pi]^6 \[Sigma]^4)/(131072 \[Omega]1))
デュアルコア ラップトップですべての積分を実行するには非常に時間がかかるため、ここでは項の数を減らします。積分のセット全体を評価する場合は、次の行を削除またはコメント アウトしてください
In[15]:= coef = RandomChoice[coef, 100]; (* Delete me!! *)
OK、単項積分結果の空のリストを初期化します
In[16]:= SetSharedVariable[ints]
ints = ConstantArray[Null, [email protected]];
積分を実行すると、133
outnum:{timing, result} 統合された単項式ごとに。142
印刷された各セルのどのコアが積分を行ったかがわかります.印刷は面倒になる可能性があります. 165
で または 178
何らかの種類の動的変数を使用して計算を監視することもできます。プログレスバー。
ParallelDo[Print[c, ": ", Timing[
ints[[c]] = Integrate[[email protected]@(fns^coef[[c,1]]), [email protected]@intLimits]]],
{c, [email protected]}]
それらの係数と組み合わせる
1/(2 Pi^5) Simplify[ints.coef[[All, 2]]]
そして(願わくば)それだけです!