GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man Befehle in Mathematica 8 dazu bringen, alle Kerne zu verwenden?

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!


Linux
  1. So verwenden Sie Bash-Verlaufsbefehle

  2. Wie verwendet man Manpages, um zu lernen, wie man Befehle verwendet?

  3. Wie kann man Startx dazu bringen, alternatives Xinitrc zu verwenden?

  4. Wie kann Skype Notify-osd verwenden?

  5. So verwenden Sie Grep-Befehle unter Linux oder FreeBSD

Verwendung von Netcat-Befehlen mit Beispielen

So installieren Sie FFmpeg unter Linux und verwenden Befehle

Wie man den Befehl „grep“ gut nutzt

So verwenden Sie die Befehle Pbcopy und Pbpaste unter Linux

3 nützliche Tipps zur Verwendung des Verlaufsbefehls unter Linux

So verwenden Sie Linux-FTP-Befehle