Mathematica: вызвать функцию внутри себя и управлять факторами

Я пытаюсь создать программу, которая обрабатывает алгебру операторов, где операторы не имеют явного представления. Это подразумевает, что мне нужно определить множество символов и параметрических функций, чтобы отслеживать, что было сделано.

У меня есть два вида операторов: V^+ и V^-.

Алгебра гласит: [V^+(a),V^+(b)]=I X[a,b] V^+(a+b) [V^-(a),V^-(b)]=I Xbar[a,b] V^-(a+b) Примечание:("a+b" не является суммой. Это объединение двух наборов ног в диаграмме Фейнмана)

Тогда имеем: V^+(a)V^+(b)=I X[a,b]V^+(a|b) с, конечно, V^+(a|b)+V^+(b| а)=V^+(а + б).

X и Xbar являются структурными константами и являются антисимметричными в двух аргументах.

Тогда мы должны определить: V^+(a|b)*V^+/-(c|d)=I X[b,c+d]V^+/-(a+b+c|d) V^-(a|b)*V^+/-(c|d)=I Xbar[b,c+d]V^+/-(a+b+c|d)

где также важно определить: V^+/-(a)=V^+/-(0|a).

Итак, в Mathematica я до сих пор определял коммутатор и произведение V, содержащих такие вещи, как a|b. Основная проблема возникает, когда я хочу вычислить структуры, где у меня есть коммутаторы коммутаторов. Вот соответствующая часть кода:Структурные константы:

XX[A_, B_] := If[A < B, X[A, B], -X[B, A]]
XXb[A_, B_] := If[A < B, Xb[A, B], -Xb[B, A]]

Это сделано для реализации антисимметрии и упрощения.Продукт с вертикальными чертами

PB[V[VB[A_,B_],K_],V[VB[C_,D_],PD_]] :=If[K == 1,I*XX[B,piu[C,D]]V[VB[piu[A,B,C],D],PD],I*XXb[B,piu[C,D]]V[VB[piu[A,B,C],D],PD]]

где я использовал функцию "piu", которая обозначает просто объединение ног, как в "a+b"(=piu[a,b]).

piu[A_, B_] := If[A != 0, If[B != 0, pi[A, B], A], If[B != 0, B, 0]]

piu[A_, B_, C_] := If[A != 0,If[B != 0, If[C != 0, pi[A, B, C], pi[A, B]],If[C != 0,pi[A, C], A]], If[B != 0, If[C != 0, pi[B, C], B], If[C != 0, C, 0]]]

Второй аргумент в V может быть 0 или 1 и означает только "+"(1) или "-"(0).

Тогда коммутаторы:

Comm[V[vb[A_, B_], K_], V[vb[C_, D_], M_]] := PB[V[VB[A, B], K], V[VB[C, D], M]]-PB[V[VB[C, D], M], V[VB[A, B], K]]
Comm[V[vb[A_, B_], K_], V[[piu[C_, D_], E_], M_]] :=PB[V[VB[A, B], K], V[VB[C, D], M]]-PB[V[VB[C, D], M], V[VB[A, B], K]]

где я непосредственно использовал "0|a" способ написания "a", чтобы избежать двусмысленности, и где я определил также особый случай, когда один из аргументов является суммой двух других.

Наконец, я создал набор правил, чтобы упростить вещи и дать мне правильные результаты:Правила

RC = {
VB[A_, B_] :> vb[A, B],
vb[A_, pi[B_, C_]] :> If[A != 0, vb[A, pi[B, C]], vb[0, pi[B, C]]],
vb[A_, B_] :> If[A != 0, If[B != 0, vb[A, B], vb[A]], If[B != 0, vb[B], 0]],
VB[Null, A_] :> vb[A],
(V[vb[A_, B_], K_] + V[vb[B_, A_], K_]) :> V[vb[0, piu[A, B]], K]
}

Я применяю правила, используя:

SimplifyRC[expr_]:=Simplify[expr]//.RC

Чтобы дать вам пример того, что происходит, вот результат для простого коммутатора: SimplifyRC[Comm[V[VB[0, 1], 1], V[VB[0, 2], 1]]]

 Out= I V[vb[0, pi[1, 2]], 1] X[1, 2]

До сих пор все в порядке.

Однако цель программы - вычислить более сложные структуры с коммутаторами коммутаторов.

Мой вопрос: как мне справиться с факторами (I, X[a,b], Xbar[a,b]), выходящими из коммутаторов внутри новых коммутаторов? Я попытался определить некоторые правила, чтобы сказать, что функция должна быть билинейной в двух аргументах, но это работает только один раз, и как только я вызываю функцию несколько раз внутри себя, проблема появляется снова.

Пример:

SimplifyRC[Comm[V[VB[0, 1], 1], Comm[V[VB[0, 2], 1], V[VB[0, 3], 1]]]]

Out= Comm[V[vb[1], 1], I V[vb[0, pi[2, 3]], 1] X[2, 3]]

Это можно легко сделать, установив правило подстановки. Однако, как только я пойду

SimplifyRC[Comm[V[VB[0, 1], 1],Comm[V[VB[0, 1], 2], Comm[V[VB[0, 3], 1], V[VB[0, 4], 1]]]]]

проблема возникнет снова, потому что внутри нового коммутатора у меня будет что-то вроде "X[a,b]X[c,d]", и правило больше не будет работать.

Есть ли умный способ реализовать правило, которое позаботится об этом и выведет из коммутатора все, что не является оператором V?

Я надеюсь, что это достаточно ясно. Код грязный, но из-за отсутствия явного представления для операторов, необходимо определить все эти функции и символы для отслеживания операций. Заранее спасибо.

0 ответов

Другие вопросы по тегам