Aus der Parallelize-Dokumentation unter Beispiele> Mögliche Probleme:
Ausdrücke, die nicht parallelisiert werden können, werden normal ausgewertet:
Parallelize[Integrate[1/(x - 1), x]]
Wie in den anderen Fragen und Kommentaren erwähnt, Dinge wie 08
und 11
wäre wirklich schwierig zu parallelisieren, also gibt Mathematica die Nachricht 28
zurück und fährt "mit sequentieller Auswertung" fort.
(Obwohl nachdenklich, vielleicht 39
parallelisiert werden könnte, da es grundsätzlich funktioniert, indem viele verschiedene Regeln ausprobiert und Blattzählungen durchgeführt werden ...)
Wenn Sie viele Integrale oder Vereinfachungen durchführen müssen, können Sie 44
verwenden oder 52
usw...
Als triviales Beispiel, wenn Sie die Integranden haben
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}
Sie können 61
verwenden
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}
oder 70
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}
Offensichtlich ist für kleine Listen von Integralen wie oben der Parallelisierungsaufwand wahrscheinlich größer als der Nutzen. Aber wenn Sie wirklich große Listen und komplexe Integrale haben, dann lohnt es sich wahrscheinlich.
Bearbeiten als Antwort auf Kommentare
Angesichts des wirklich chaotischen Integranden, an dem das OP interessiert ist (Hinweis:Sie sollten Ihre Ergebnisse wirklich vereinfachen!), Hier ist ein Code, der das Integral in eine Summe von Monomen zerlegt und die Integrale mit 84
.
Zuerst importieren wir das Integral aus Pastebin
In[1]:= import = Import["http://pastebin.com/raw.php?i=JZ0CXewJ", "Text"];
Extrahieren Sie die Integrationsdomäne
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}}
und der Integrand, der sich aus der Summe von 21 monströsen Termen ergibt
In[4]:= integrand = [email protected](2 Pi^5 ToExpression[StringReplace[import, "Integrate" -> "Hold"]]);
Length[integrand]
LeafCount[integrand]
Out[5]= 21
Out[6]= 48111
Wir müssen das schreckliche Durcheinander in mundgerechte Stücke zerlegen. Zuerst extrahieren wir alle verschiedenen Funktionen aus dem Integral
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]}}
Wir finden die (13849 nicht verschwindenden) Koeffizienten von Monomen konstruiert aus 93
In[8]:= coef = CoefficientRules[integrand, fns]; // Timing
[email protected]
Out[8]= {35.63, Null}
Out[9]= 13849
Überprüfen Sie, ob alle Koeffizienten frei von Integrationsvariablen sind
In[10]:= FreeQ[coef[[All, 2]], [email protected]@vars]
Out[10]= True
Beachten Sie, dass wir die Koeffizienten tatsächlich mit 108
bereinigen können oder 112
und verringern Sie die 127
um etwa das 5-fache ... Aber da die Integrale der meisten Monome Null sind, können wir die Vereinfachungen genauso gut bis zum Ende aufheben.
So rekonstruieren Sie ein Monom, integrieren es und rekombinieren mit seinem Koeffizienten, zum Beispiel ergibt das 40. Monom ein nicht verschwindendes Integral:
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))
Im Moment reduziere ich die Anzahl der Terme, da es ewig dauern würde, alle Integrale auf meinem Dual-Core-Laptop zu berechnen. Löschen oder kommentieren Sie die folgende Zeile aus, wenn Sie den gesamten Satz von Integralen auswerten möchten
In[15]:= coef = RandomChoice[coef, 100]; (* Delete me!! *)
OK, initialisiere eine leere Liste für die Ergebnisse der monomialen Integration
In[16]:= SetSharedVariable[ints]
ints = ConstantArray[Null, [email protected]];
Während wir die Integrale ausführen, 138
outnum:{Timing, Ergebnis} für jedes Monom integriert. Die 147
jeder gedruckten Zelle sagt Ihnen, welcher Kern das Integral gemacht hat. Das Drucken kann lästig werden - wenn es Sie stört, dann ersetzen Sie 159
mit 160
oder 173
.Sie könnten die Berechnung auch mit einer Art dynamischer Variable überwachen:z. einen Fortschrittsbalken.
ParallelDo[Print[c, ": ", Timing[
ints[[c]] = Integrate[[email protected]@(fns^coef[[c,1]]), [email protected]@intLimits]]],
{c, [email protected]}]
Kombiniere mit ihren Koeffizienten
1/(2 Pi^5) Simplify[ints.coef[[All, 2]]]
Und (hoffentlich) das war's!