2010-11-05 16 views
6

El siguiente código crea un diagrama de un cierto cálculo. Mi problema es que, aunque los términos en denominador están en un buen orden, después de aplicar Plus en él, se reorganizan arbitrariamente. ¿Alguna sugerencia sobre cómo forzar el orden original para que se guarde?Evitar que "Plus" reordene las cosas

http://yaroslavvb.com/upload/ind-sets-grid.png

 
r[i_] := Floor[(i - 1)/n] + 1; 
c[i_] := Mod[i, n, 1]; 
adj[a_, b_] := Abs[r[a] - r[b]] + Abs[c[a] - c[b]] == 1; 
indsetQ[s_] := Not[Or @@ (adj @@@ Subsets[s, {2}])]; 
indsets[k_] := Select[Subsets[Range[n^2], {k}], indsetQ]; 
twoColorGraph[g_, seen_, lbl_] := Module[{radius = .22}, 
    vcoords = # -> {c[#], n - r[#]} & /@ Range[n^2]; 
    fv = Function[{p, v}, {EdgeForm[Thick], 
     If[MemberQ[seen, v], Pink, White], Disk[p, radius]}]; 
    GraphPlot[g, VertexLabeling -> True, VertexRenderingFunction -> fv, 
    PlotLabel -> Style[lbl, 20], LabelStyle -> Directive[Bold], 
    VertexCoordinateRules -> vcoords, ImageSize -> 80] 
    ]; 
n = 2; 
g = Array[Boole[adj[#1, #2]] &, {n^2, n^2}]; 
weight[set_] := Times @@ (Subscript[\[Lambda], c[#], r[#]] & /@ set); 
denominator = 
    twoColorGraph[g, #, weight[#]] & /@ 
    Join @@ (indsets[#] & /@ Range[2]); 
numerator = twoColorGraph[g, {1}, weight[{1}]]; 
Style[numerator/(Plus @@ denominator), FontSize -> 30] 
+0

Esto es un duplicado, en la intención, si no en la forma, de otra pregunta (http://stackoverflow.com/questions/3947071/controlling-order-of-variables-in-an-expression). De lo contrario, te daría un +1 solo por los gráficos. ¿Para qué sirve el cálculo? – rcollyer

+0

Sí, eso es similar. La sugerencia allí es definir una función propia que no esté sin orden como "myPlus", pero ¿cómo hago para que se muestre lo mismo que "Plus"? –

+0

El cálculo consiste en encontrar probabilidades de ocupación por sitio de gas local repulsivo de núcleo duro en una cuadrícula finita (es decir, gran gas canónico con auto-repulsión de núcleo duro e interacción de núcleo duro) –

Respuesta

5

El truco para dar formato a algo así como a myPlusvistazo como Plus en la salida es utilizar Format. Aquí hay un ejemplo simple para empezar:

Entonces, lo que se ve visualmente en el bloc de notas es:

In[7]:= x = myPlus[3, 2, 1] 
Out[7]= 3+2+1 

... pero todavía tendrá x cabeza myPlus.

Aquí es una tutorial de la documentación que entra en más detalles sobre el formato de salida, la precedencia de operadores, etc.

Espero que ayude!

+1

+1, estaba tratando de hacer eso con 'Notation' y estaba fallando miserablemente. Me olvidé de mirar 'Formato' directamente. – rcollyer

+0

Intenté incorporar 'Interpretation' con tu respuesta para que pueda copiarse y pegarse correctamente, pero tuvo problemas. Vea la pregunta SO http://stackoverflow.com/q/4112299/421225 – Simon

Cuestiones relacionadas