упрощение и перестановка некоммутативных переменных в математике - PullRequest
4 голосов
/ 18 октября 2010

Короче говоря, у меня есть выражение, которое содержит умножения между p1, p2, q1 и q2, и я хотел бы использовать [qi,pi]=ii*hb, где i={1,2}, чтобы получить выражение для симметричная форма (pi^a*qi^b+qi^b*pi^a)/2.

Так, например, для p2*q2*p2^2 я получаю (p2*q2^3+q2^3*p2)/2 + 1/2*ii*p2^2*hb, используя упрощение и некоторые замены. Но я не могу упростить q2*q1^2*p2, хотя я указал правило q2*p2-> (p2*q2+q2*p2)/2 +ii/2*hb, и переменные с 1 и 2 коммутируют.

Более подробно, вот код Mathematica (я использую квантовый пакет ).

Код работает, когда индекс равен 1 или 2, но не работает, когда используются оба индекса:

p2*q2*q1*q2 дает p2*q1*q2^2, p2*q2*q2 может быть дополнительно упрощено, но поскольку существует q1, Mathematica не делает этого.

Более подробно: я пытаюсь написать код Mathematica, который может получить уравнения в приложении (уравнение A2) в этой статье и это код , который я использую. Код в последнем файле немного отличается от кода выше, потому что я не смог заставить его работать, но он был бы идеальным.

В конце я хотел бы использовать окончательный код для других видов гамильтонианов вплоть до 4-й степени или даже выше.

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

1 Ответ

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

Если вы просто используете правила для упрощения (и я предполагаю, что вы имеете в виду, что вы используете 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[] может очень легко сделать то, что вы хотите.

И еще один способ: когда мне приходилось выполнять вычисления с некоммутативными переменными, которые я использовал это пакет, содержащий алгебру и исчисление для грассмановых переменных.



...