2016-03-18 1 views
1

Я хочу выработать некоторые манипуляции с коммутаторами и нашел этот инструмент в sympy. Кажется, он работает как ожидалось (но документация практически не существует или, по крайней мере, я нашел мало, но см. Комментарий Далтона Бентли ниже), но я столкнулся с следующей проблемой.Как использовать sympy.physics.quantum Commutator?

from sympy.physics.quantum import Commutator as Comm 
from sympy.physics.quantum import Operator 
A = Operator('A') 
B = Operator('B') 
C = Comm(Comm(Comm(A,B),A),B) 
D = Comm(Comm(Comm(A,B),B),A) 
E = (C-D).expand(commutator=true) 
E 
>>> [[[A,B],A],B] - [[[A,B],B],A] 

вместо ожидаемого результата простого 0 (так как [[[А, В], А], В] = [[[А, В], В], А]). Итак, как я могу заставить более простой результат без оценки коммутаторов (т. Е. Без вызова функции doit())? Отметьте, что

simplify(E.doit()) 
>>> 0 

дает желаемый результат.

+0

Почему вызывающий 'Doit()' вопрос? Как правило, SymPy является консервативным с автоматическим упрощением, поскольку упрощение может быть очень дорогостоящим (а стоимость, как правило, трудно предсказать априори). EDIT: Или вы хотите научить SymPy об идентичности коммутатора? –

+0

@BjoernDahlgren Я хочу знать ответ в неоценимом контексте, то есть я хочу выражение коммутатора. Упрощение в неоцененном контексте должно получиться равным нулю для результата выше. – Walter

+2

Я вижу, что я могу сказать [он не реализован] (https://github.com/sympy/sympy/blob/112d6abaf2c777a844d4290db9ecd952053a4a55/sympy/physics/quantum/commutator.py#L121). Вы можете открыть для него проблему. –

ответ

1

В настоящее время в SymPy, Commutator._eval_expand_commutator, не указан этот идентификатор, поэтому для его упрощения нужно расширить коммутаторы (в вашем методе .doit).

Для этого потребуется добавить специальный случай (ы) к методу Commutator._eval_expand_commutator, если аргументы коммутатора содержат коммутаторы, а затем проверить известные идентификаторы.

Я открыл вопрос для этого здесь: https://github.com/sympy/sympy/issues/10892