我引用了一個庫相關問題的筆記本日。
http://library.wolfram.com/infocenter/Conferences/325/
How to expand the arithematics of differential operators in mathematica
我嬰兒牀一些相關的代碼。我首先再次提到我要定義和使用我自己的非對易算子,以避免來自內置NonCommutativeMultiply的模式匹配問題。此外,我將使用[...]而不是下標[a,...]來簡化ascii記法和Mathematica輸入/輸出的剪切粘貼。
我們將某些「基本」實體歸類爲標量或變量,後者是具有減速限制的事物。我並沒有把這一點儘可能接近,而只是將標量定義爲非常明顯的「非變量」。
variableQ[x_] := MemberQ[{a, b, c, d}, Head[x]]
scalarQ[x_?NumericQ] := True
scalarQ[x_[a_]^n_. /; !variableQ[x[a]]] := True
scalarQ[_] := False
ncTimes[] := 1
ncTimes[a_] := a
ncTimes[a___, ncTimes[b___, c___], d___] := ncTimes[a, b, c, d]
ncTimes[a___, x_ + y_, b___] := ncTimes[a, x, b] + ncTimes[a, y, b]
ncTimes[a___, n_?scalarQ*c_, b___] := n*ncTimes[a, c, b]
ncTimes[a___, n_?scalarQ, b___] := n*ncTimes[a, b]
ncTimes[a___, x_[i_Integer]^m_., x_[i_]^n_., b___] /;
variableQ[x[i]] := ncTimes[a, x[i]^(m + n), b]
ncTimes[a___, x_[i_Integer]^m_., y_[j_Integer]^n_., b___] /;
variableQ[x[i]] && ! OrderedQ[{x, y}] := (* !!! *)
ncTimes[a, y[j]^n, x[i]^m, b]
我只用稍微修改過的輸入表單,所以我們會將**表達式轉換爲使用ncTimes。
Unprotect[NonCommutativeMultiply];
NonCommutativeMultiply[a___] := ncTimes[a]
這是你的例子。
In[124]:=
a[-4] ** b[1] ** a[-4] ** b[-4] ** a[1] ** c[-4] ** c[1] ** c[5]
Out[124]= ncTimes[a[-4]^2, a[1], b[1], b[-4], c[-4], c[1], c[5]]
這個看起來很費力的方法的好處是你可以很容易地定義換向器。例如,我們已經(隱含地)在制定上述規則時應用了這一個。
commutator[x_[a_], y_[b_]] /; x =!= y || !VariableQ[x[a] := 0
一般來說,如果你有換向器的規則,如
ncTimes[a[j],a[i]] == ncTimes[a[i],a[i]]+(j-i)*a[i]
每當J>時我,那麼你可以規範化,通過將A [1]前[J]中的所有表情說。爲此,您需要修改標記的規則(!!!)以解釋此類換向器。
我應該補充一點,我還沒有完全測試過上述代碼。
丹尼爾Lichtblau 沃爾夫勒姆研究
您是否知道具有相同下標的對象的換向屬性?如果不是,那麼你不會得到表達式的獨特形式 - 並將它們組合將是不理想的。 – Simon 2011-02-14 02:58:20