2010-11-05 7 views
6

Der folgende Code erstellt ein Diagramm einer bestimmten Berechnung. Mein Problem ist, dass, obwohl die Begriffe im Nenner in einer netten Reihenfolge sind, nach dem Anwenden von Plus auf sie willkürlich neu angeordnet werden. Irgendwelche Vorschläge, wie man die ursprüngliche Reihenfolge zwingen kann, gehalten zu werden?Verhindern von „Plus“ von Neuanordnung Dinge

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

Dies ist ein Duplikat, in der Absicht, wenn nicht zu bilden, der eine andere Frage (http://stackoverflow.com/questions/3947071/controlling-order-of-variables-in-an-expression). Sonst würde ich Ihnen nur +1 für die Grafik geben. Für was ist die Berechnung? – rcollyer

+0

Ja, das ist ähnlich. Der Vorschlag ist, eigene Funktionen zu definieren, die nicht wie "myPlus" funktionieren, aber wie bekomme ich das Gleiche wie "Plus"? –

+0

Die Berechnung ist pro-Stellenbesetzungswahrscheinlichkeiten harten Kern abstoßend lokalen Gas auf einem endlichen Gitter (dh großkanonische Gas mit harten Kern der Selbst Abstoßung und Hard-Core-Paar-Wechselwirkung) –

Antwort

5

Der Trick etwas wie myPlus zu aussehen wie Plus auf Ausgabe an die Formatierung Format zu verwenden. Hier ist ein einfaches Beispiel für den Einstieg:

Dann, was Sie visuell in dem Notebook zu sehen ist:

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

... aber x noch myPlus Kopf haben wird.

Hier ist eine tutorial von der Dokumentation, die über Formatierungsausgang, Operator Vorrang usw.

Hoffnung, die hilft in mehr Details geht!

+1

+1, ich habe versucht, das zu tun mit 'Notation' und es kläglich versagt. Ich habe vergessen, 'Format' direkt anzusehen. – rcollyer

+0

Ich habe versucht, 'Interpretation' mit Ihrer Antwort zu übernehmen, so dass es richtig kopiert und eingefügt werden kann, sondern lief in Probleme. Siehe die SO-Frage http://stackoverflow.com/q/4112299/421225 – Simon