GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo hacer que los comandos en Mathematica 8 usen todos los núcleos?

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!


Linux
  1. Cómo usar los comandos del historial de Bash

  2. ¿Cómo usar las páginas man para aprender a usar los comandos?

  3. Cómo usar los comandos Grep en Linux o FreeBSD

  4. Cómo auditar todos los comandos ejecutados en OEL 5,6 usando auditd

  5. Cómo usar los comandos strace y ltrace en Linux

Cómo usar los comandos de Netcat con ejemplos

Cómo instalar FFmpeg en Linux y usar comandos

Cómo hacer un buen uso del comando 'grep'

Cómo usar los comandos Pbcopy y Pbpaste en Linux

3 consejos útiles sobre cómo usar el comando de historial en Linux

Cómo usar los comandos FTP de Linux