2010-11-05 3 views
6

Le code suivant crée un diagramme d'un certain calcul. Mon problème est que même si les termes du dénominateur sont dans un bon ordre, après avoir appliqué Plus, ils sont réarrangés arbitrairement. Des suggestions pour forcer la commande d'origine à conserver?Empêcher "Plus" de réarranger les choses

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

Ceci est un doublon, dans l'intention, si ce n'est pas la forme, d'une autre question (http://stackoverflow.com/questions/3947071/controlling-order-of-variables-in-an-expression). Sinon, je vous donnerais un +1 pour les graphiques seuls. À quoi sert le calcul? – rcollyer

+0

Oui, c'est similaire. La suggestion est de définir sa propre fonction qui n'est pas sans ordre comme "myPlus", mais comment l'obtenir pour rendre le même que "Plus"? –

+0

Le calcul consiste à trouver des probabilités d'occupation par site de gaz local répulsif à noyau dur sur une grille finie (c.-à-d. Gaz grand canonique avec auto-répulsion et interaction de noyau dur) –

Répondre

5

L'astuce pour le formatage quelque chose comme myPlus à regarder comme Plus sur la sortie est d'utiliser Format. Voici un exemple simple pour vous aider à démarrer:

Alors, ce que vous verrez visuellement dans le bloc-notes est:

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

... mais x aura encore la tête myPlus.

Voici un tutorial de la documentation qui va dans plus de détails sur le formatage de sortie, la priorité des opérateurs, etc.

Hope that helps!

+1

+1, j'essayais de le faire avec 'Notation' et il échouait lamentablement. J'ai oublié de regarder 'Format' directement. – rcollyer

+0

J'ai essayé d'incorporer Interprétation avec votre réponse afin qu'elle puisse être copiée et collée correctement, mais elle a rencontré des problèmes. Voir la question SO http://stackoverflow.com/q/4112299/421225 – Simon