2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Порядок выполнения операций [Mathematica]
Сообщение08.02.2014, 22:21 


08/03/11
186
Как можно определить операцию, которая действует по правилу
Код:
f1**f2**f3**...=(...(f1**f2)**f3)**...)
то есть выполняется слева направо либо нужно как то правильно расставить скобки.

 Профиль  
                  
 
 Re: Порядок выполнения операций [Mathematica]
Сообщение08.02.2014, 22:51 
Заслуженный участник


25/02/11
1797
В хелпе написано
Цитата:
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 


08/03/11
186
Vince Diesel, спасибо за ответ, но я был неточен.
В моем случае предыдущий код выдает упорядоченый полином, ** используется что бы он был упорядоченым.
Потом ** переопределен через Unprotect, конкретно, это скобка Пуассона.
Так как ** ассоциативный, выражение вида $f1**f2**f2$ дает ноль, так как $ f2$ комутирует с собой,
а мне нужно, чтобы операции были слева направо, тогда $f1**f2**f2=[[f1,f2],f2]\ne 0$

 Профиль  
                  
 
 Re: Порядок выполнения операций [Mathematica]
Сообщение09.02.2014, 07:56 
Заслуженный участник


25/02/11
1797
Эта операция ассоциативна, так что она будет всегда пытаться упростить выражение по разному расставляя скобки. Можно определить свою собственную команду, скажем pb[f1_,f2_]=... И прописать те свойсва, которые нужны. Тогда pb[pb[f1,f2],f2] будет давать то, что надо. Минусом будет то, что не так хорошо смотреться будет и все свойства вручную определять придется. Либо использовать какую-либо незанятую операцию без свойств, например $\otimes$, CircleTimes. Но тогда тоже все свойства придется прописывать.

 Профиль  
                  
 
 Re: Порядок выполнения операций [Mathematica]
Сообщение09.02.2014, 12:16 


08/03/11
186
Спасибо,
Цитата:
Но тогда тоже все свойства придется прописывать
Это мне понятно, я хотел переопределить ** и убрать ассоциативность через 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 
Заслуженный участник


25/02/11
1797
С этим будут сложности, так как м-ка сначала упрощает выражение в скобках, а потом уже применяет $\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 


08/03/11
186
Большое спасибо, 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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group