2010-10-16 5 views
3

Dans Mathematica, comment changez-vous l'ordre d'importance des variables? par exemple: si j'entre b + c + a + d, j'obtiens a + b + c + d mais je veux que b et d précèdent d'autres variables. de sorte que je reçois b + d + a + cContrôle de l'ordre des variables dans une expression

note, je voudrais l'utiliser où + est non-commutative

Répondre

5

D'abord, vous devez définir une fonction de commande comme:

In[1]:= CPOrdering[a]=3; 
CPOrdering[b]=1; 
CPOrdering[d]=2; 
CPOrdering[c]=4; 

Bien que, pour des exemples plus complexes, vous devrait probablement être plus intelligent à ce sujet que cela - c.-à-d.

Ensuite, vous pouvez trier les expressions utilisant

In[5]:= CirclePlus[a,b,c,d] 
SortBy[%,CPOrdering] 
Out[5]= a\[CirclePlus]b\[CirclePlus]c\[CirclePlus]d 
Out[6]= b\[CirclePlus]d\[CirclePlus]a\[CirclePlus]c 

Cela peut ensuite être automatisé en utilisant quelque chose comme

CPOrdering[a_, b_] := CPOrdering[a] < CPOrdering[b] 
CirclePlus[a__] /; (!OrderedQ[{a}, CPOrdering]) := [email protected]@SortBy[{a}, CPOrdering] 
+0

+1 très propre! Encore un char à faire ... –

1

Donc, ne pas utiliser "+", parce que plus [] IS commutatif.

Définissez votre propre myPlus [x_, y _]: = .... peu importe.

Si vous avez une idée de ce que votre nouveau plus [] devrait faire, poster et nous pouvons essayer de vous aider à la définition/

HTH!

PS> Vous pouvez modifier la définition de Plus [] ... mais :)

+0

probablement mieux si vous utilisez quelque chose comme CirclePlus - parce qu'il a déjà une belle notation infixée. – Simon

+0

-1, aucune tentative pour répondre à la question – rcollyer

2

La raison sous-jacente b+c+a+d devient a+b+c+d dans Mathematica est parce que Plus a l'attribut Orderless. En général, un symbole f avec l'attribut Orderless signifie que les éléments de f dans un expession f[e1, e2, e3], les éléments ei doivent être classés dans l'ordre canonique, et en particulier, l'ordre canonique de Mathematica équivalent à celui de OrderedQ et Ordering.

Orderless est même représenté au cours de correspondance de motif:

In[47]:= a+b+c+d /. a+c -> e 
Out[47]= b+d+e 

Il est fortement, fortement recommandé que vous ne supprimez pas l'attribut Orderless de Plus parce que les conséquences pourraient être désastreuses pour de nombreuses fonctionnalités dans Mathematica.

Comme d'autres affiches l'ont noté, le mieux est de simplement définir votre propre fonction qui n'est PAS Orderless, et donc de préserver l'ordre des arguments. Vous pouvez également trouver HoldForm utile dans des circonstances très limitées.

Notez également que rien ne vous empêche de symboles typesetting dans une expression dans l'ordre que vous voulez dans un ordinateur portable, aussi longtemps que vous n'évaluez en place non, etc.