2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Порядок выполнения операций [Mathematica]
Сообщение08.02.2014, 22:21 
Как можно определить операцию, которая действует по правилу
Код:
f1**f2**f3**...=(...(f1**f2)**f3)**...)
то есть выполняется слева направо либо нужно как то правильно расставить скобки.

 
 
 
 Re: Порядок выполнения операций [Mathematica]
Сообщение08.02.2014, 22:51 
В хелпе написано
Цитата:
a**b**c is a general associative, but non-commutative, form of multiplication.

А проверить так: команда
Код:
(f1 ** f2) ** f3 == f1 ** (f2 ** f3)

дает True.

 
 
 
 Re: Порядок выполнения операций [Mathematica]
Сообщение09.02.2014, 05:23 
Vince Diesel, спасибо за ответ, но я был неточен.
В моем случае предыдущий код выдает упорядоченый полином, ** используется что бы он был упорядоченым.
Потом ** переопределен через Unprotect, конкретно, это скобка Пуассона.
Так как ** ассоциативный, выражение вида $f1**f2**f2$ дает ноль, так как $ f2$ комутирует с собой,
а мне нужно, чтобы операции были слева направо, тогда $f1**f2**f2=[[f1,f2],f2]\ne 0$

 
 
 
 Re: Порядок выполнения операций [Mathematica]
Сообщение09.02.2014, 07:56 
Эта операция ассоциативна, так что она будет всегда пытаться упростить выражение по разному расставляя скобки. Можно определить свою собственную команду, скажем pb[f1_,f2_]=... И прописать те свойсва, которые нужны. Тогда pb[pb[f1,f2],f2] будет давать то, что надо. Минусом будет то, что не так хорошо смотреться будет и все свойства вручную определять придется. Либо использовать какую-либо незанятую операцию без свойств, например $\otimes$, CircleTimes. Но тогда тоже все свойства придется прописывать.

 
 
 
 Re: Порядок выполнения операций [Mathematica]
Сообщение09.02.2014, 12:16 
Спасибо,
Цитата:
Но тогда тоже все свойства придется прописывать
Это мне понятно, я хотел переопределить ** и убрать ассоциативность через SetAttributes[], но не нашел атрибута, который за это отвечает.
Код:
Unprotect[NonCommutativeMultiply];
(* SetAttributes[NonCommutativeMultiply, ?]*)
DIMENSIONS = 1;
COORDINATES =Table[{Subscript[X, i], Subscript[P, i]}, {i, 1, DIMENSIONS}] //    Flatten;
x_ ** y_ :=   Sum[D[x, Subscript[X, i]] D[y, Subscript[P, i]] - D[x, Subscript[P, i]] D[y, Subscript[X, i]], {i, 1, DIMENSIONS}];
Проблема в том, что есть многочлены, например,
Код:
-(1/12) x ** y ** x + x ** y ** y/12
которые определяю не я, моя же задача -- правильно их вычислить, то есть, (используя, например, переопред. **), сделать так чтобы они вычислялись как
Код:
-(1/12) (x ** y) ** x + (x ** y) ** y/12
либо привести их к этому виду.

Эту задачу можно сформулировать так: найти такую $\phi$ (вставить скобки так чтобы)
$\phi: f1**f2**f3**... \to (...((f1**f2)**f3)**...)$)

 
 
 
 Re: Порядок выполнения операций [Mathematica]
Сообщение09.02.2014, 13:40 
С этим будут сложности, так как м-ка сначала упрощает выражение в скобках, а потом уже применяет $\phi$. Как я уже сказал, можно взять вместо ** незанятую операцию, например, CircleTimes, и прописать такие свойства, какие нужно. Вычисление слева направо:
Код:
CircleTimes[a_, b_, c__] = CircleTimes[CircleTimes[a, b], c]

На CircleTimes[p, q, r, s] получается $((p\otimes q)\otimes r)\otimes s$.
Дистрибутивность, если нужно
Код:
CircleTimes[a_ + b_, c_] = CircleTimes[a, c] + CircleTimes[b, c]
CircleTimes[a_, b_ + c_] = CircleTimes[a, b] + CircleTimes[a, c]

и т.д. А коммутативности нет, поскольку по умолчанию у этой операции вообще никаких свойств нет.

 
 
 
 Re: Порядок выполнения операций [Mathematica]
Сообщение09.02.2014, 13:56 
Большое спасибо, Vince Diesel, я даже и не знал, что так можно. Теперь все как надо.
Код:
DIMENSIONS = 1;
COORDINATES = Table[{Subscript[X, i], Subscript[P, i]}, {i, 1, DIMENSIONS}] //  Flatten;
CircleTimes[a_, b_, c__] := CircleTimes[CircleTimes[a, b], c];
x_\[CircleTimes]y_ := Sum[D[x, Subscript[X, i]] D[y, Subscript[P, i]] - D[x, Subscript[P, i]] D[y, Subscript[X, i]], {i, 1, DIMENSIONS}];
(*пример*)
Subscript[P, 1]^4 \[CircleTimes]Subscript[X,1]\[CircleTimes]Subscript[X, 1]\[CircleTimes]Subscript[X,1]\[CircleTimes]Subscript[X, 1]

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group