Если вы просто используете правила для упрощения (и я предполагаю, что вы имеете в виду, что вы используете Replace[]
), тогда могут возникнуть проблемы, если шаблон, который вы хотите заменить, присутствует, но не в точной правильной форме.Например, ваш пример Replace[q2*q1^2*p2,q2*p2->(p2*q2+q2*p2)/2]
, который ничего не будет делать в этом случае (Обратите внимание, что написание q2*p2*q1^2
также не поможет, так как Mathematica сортирует весь ввод перед началом оценки.
В прошлом я сталкивался с подобным упрощениемпроблемы с Mathematica и есть две стратегии, которые принесли разумный успех. Извините, я не могу дать вам конкретное решение, я надеюсь, что они помогут вам разобраться.
Решение 1: Вы должны написатьваша собственная функция ReplaceUnordered[form,rule]
, которая анализирует все различные порядки form
для возможных применений rule
. Это можно сделать с помощью Permutations[]
и использованием HoldForm[]
.
Решение 2:Используйте Simplify[]
. Специально используйте параметр ComplexityFunction , чтобы сделать несимметричные выражения более «дорогими», и параметр TransformationFunctions , чтобы указать свои собственные правила упрощения.
Здесь (pdf) - краткое краткое описание Mathematica, его конструкций и оценки.в процессе.
Дополнительное бонусное решение: Используйте FORM , который написан специально для решения вашей проблемы.
РЕДАКТИРОВАТЬ: Extra Extra Bonus (возможно, очень простой) Решение:Как указал rcollier , SymmetricReduction[]
может очень легко сделать то, что вы хотите.
И еще один способ: когда мне приходилось выполнять вычисления с некоммутативными переменными, которые я использовал это пакет, содержащий алгебру и исчисление для грассмановых переменных.