2010-11-05 12 views
6

Il seguente codice crea uno schema di un determinato calcolo. Il mio problema è che anche se i termini in denominatore sono in un buon ordine, dopo aver applicato Plus su di essi, vengono riorganizzati arbitrariamente. Qualche suggerimento su come forzare l'ordine originale da conservare?Impedire a "Più" di riorganizzare le cose

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

Questo è un duplicato, nell'intento, se non nella forma, di un'altra domanda (http://stackoverflow.com/questions/3947071/controlling-order-of-variables-in-an-expression). Altrimenti, ti darei un +1 per la grafica da solo. A cosa serve il calcolo? – rcollyer

+0

Sì, è simile. Il suggerimento è di definire la propria funzione che non è ordinata come "myPlus", ma come faccio a renderla uguale a "Plus"? –

+0

Il calcolo consiste nel trovare le probabilità di occupazione per sito di gas locale repulsivo rigido su una griglia finita (cioè, grande gas canonico con auto-repulsione hard-core e interazione hard-core) –

risposta

5

Il trucco per la formattazione qualcosa di simile a myPlusguardare come Plus in uscita è quello di utilizzare Format. Ecco un semplice esempio per iniziare:

Allora, che cosa si vedrà visivamente il notebook è:

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

... ma x avrà ancora la testa myPlus.

Ecco un tutorial dalla documentazione che va in ulteriori dettagli sulla formattazione di uscita, precedenza degli operatori, ecc

Speranza che aiuta!

+1

+1, stavo cercando di farlo con 'Notation' e stava fallendo miseramente. Ho dimenticato di guardare direttamente su 'Format'. – rcollyer

+0

Ho cercato di incorporare "Interpretazione" con la tua risposta in modo che possa essere copiata e incollata correttamente, ma ha incontrato problemi. Vedi la domanda SO http://stackoverflow.com/q/4112299/421225 – Simon

Problemi correlati