Desde la documentación de Parallelize, en Ejemplos> Posibles problemas:
Las expresiones que no se pueden paralelizar se evalúan normalmente:
Parallelize[Integrate[1/(x - 1), x]]
Como se mencionó en las otras preguntas y comentarios, cosas como Integrate
y Simplify
sería realmente difícil de paralelizar, por lo que Mathematica devuelve el mensaje Parallelize::nopar1
y procede "con evaluación secuencial".
(Aunque pensándolo bien, tal vez FullSimplify
podría ser paralelizado, ya que básicamente funciona probando muchas reglas diferentes y contando las hojas...)
Si tiene que hacer muchas integrales o simplificaciones, puede usar ParallelTable
o ParallelMap
etc...
Como ejemplo trivial, si tienes los integrandos
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}
Puedes usar ParallelTable
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}
o ParallelMap
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}
Obviamente, para listas pequeñas de integrales como la anterior, la sobrecarga de paralelización es probablemente mayor que el beneficio. Pero si tiene listas realmente largas e integrales complejas, probablemente valga la pena.
Editar en respuesta a los comentarios
Dado el integrando realmente desordenado en el que está interesado el OP (nota:¡realmente debería simplificar sus resultados sobre la marcha!), aquí hay un código que divide la integral en una suma de monomios y realiza las integrales usando ParallelDo
.
Primero importamos la integral desde pastebin
In[1]:= import = Import["http://pastebin.com/raw.php?i=JZ0CXewJ", "Text"];
extraer el dominio de integración
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}}
y el integrando, que viene como la suma de 21 términos monstruosos
In[4]:= integrand = [email protected](2 Pi^5 ToExpression[StringReplace[import, "Integrate" -> "Hold"]]);
Length[integrand]
LeafCount[integrand]
Out[5]= 21
Out[6]= 48111
Necesitamos dividir el horrible desastre en trozos pequeños. Primero extraemos todas las diferentes funciones de la 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]}}
Encontramos los coeficientes (13849 no nulos) de monomios construidos a partir de fns
In[8]:= coef = CoefficientRules[integrand, fns]; // Timing
[email protected]
Out[8]= {35.63, Null}
Out[9]= 13849
Verifique que todos los coeficientes estén libres de cualquier variable de integración
In[10]:= FreeQ[coef[[All, 2]], [email protected]@vars]
Out[10]= True
Tenga en cuenta que en realidad podemos limpiar los coeficientes usando Factor
o Simplify
y disminuya el ByteSize
por unas 5 veces... Pero dado que las integrales de la mayoría de los monomios son cero, también podríamos dejar las simplificaciones hasta el final.
Así es como reconstruyes un monomio, lo integras y lo recombinas con su coeficiente, por ejemplo, el monomio 40 da una integral que no desaparece:
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))
Por ahora, reduciré la cantidad de términos, ya que llevaría una eternidad hacer todas las integrales en mi computadora portátil de doble núcleo. Elimine o comente la siguiente línea cuando desee evaluar todo el conjunto de integrales
In[15]:= coef = RandomChoice[coef, 100]; (* Delete me!! *)
OK, inicialice una lista vacía para los resultados de integración monomio
In[16]:= SetSharedVariable[ints]
ints = ConstantArray[Null, [email protected]];
Mientras realizamos las integrales, Print
outnum:{tiempo, resultado} para cada monomio integrado. El CellLabel
de cada celda impresa le dice qué núcleo hizo la integral. La impresión puede volverse molesta; si le molesta, entonces reemplace Print
con PrintTempory
o ##&
.También puede monitorear el cálculo utilizando una variable dinámica de algún tipo:p. una barra de progreso.
ParallelDo[Print[c, ": ", Timing[
ints[[c]] = Integrate[[email protected]@(fns^coef[[c,1]]), [email protected]@intLimits]]],
{c, [email protected]}]
Combinar con sus coeficientes
1/(2 Pi^5) Simplify[ints.coef[[All, 2]]]
¡Y (con suerte) eso es todo!