управление порядком переменных в выражении - PullRequest
3 голосов
/ 16 октября 2010

В Mathematica, как вы меняете порядок важности переменных? например: если я введу b + c + a + d, я получу a + b + c + d, но я хочу, чтобы b и d предшествовали другим переменным. так что я получаю b + d + a + c

обратите внимание, я бы хотел использовать его там, где + некоммутативен

Ответы [ 3 ]

5 голосов
/ 16 октября 2010

Сначала вам нужно определить функцию упорядочения, например:

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

Хотя для более сложных примеров вы, вероятно, должны быть умнее, чем это - то есть использовать сопоставление с образцом.

Затем вы можете сортировать выражения, используя

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

Это может быть автоматизировано с помощью чего-то вроде

CPOrdering[a_, b_] := CPOrdering[a] < CPOrdering[b]
CirclePlus[a__] /; (!OrderedQ[{a}, CPOrdering]) := CirclePlus@@SortBy[{a}, CPOrdering]
2 голосов
/ 17 октября 2010

Основная причина b+c+a+d становится a+b+c+d в Mathematica, потому что Plus имеет атрибут Orderless.В общем, символ f с атрибутом Orderless означает, что элементы f в выражении f[e1, e2, e3], элементы ei должны быть отсортированы в каноническом порядке, и, в частности, канонический порядок Mathematica эквивалентенOrderedQ и Ordering.

Orderless даже учитывается при сопоставлении с образцом:

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

Настоятельно рекомендуется НЕ УДАЛЯТЬ атрибут Orderlessот Plus, потому что последствия могут быть ужасными для многих функций в Mathematica.

Как отмечали другие авторы, лучше всего просто определить свою собственную функцию, которая НЕ является Orderless и поэтому сохранитпорядок аргументов.Вы также можете найти HoldForm полезным в очень ограниченных обстоятельствах.

Также обратите внимание, что ничто не мешает вам набирать символы в выражении в любом порядке, который вы хотите в блокноте, если вы не оцениваетеи т. д.

1 голос
/ 16 октября 2010

Итак, не используйте «+», потому что Plus [] IS коммутативный.

Определите свой собственный myPlus [x_, y _]: = .... что угодно.

Если у вас есть представление о том, что должен делать ваш новый Plus [], опубликуйте его, и мы можем попытаться помочь вам с определением /

HTH!

PS>Вы можете изменить определение Плюс [] ... но:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...