前几天我引用了一个图书馆笔记本来回答一个相关问题。
http://library.wolfram.com/infocenter/Conferences/325/
How to expand the arithematics of differential operators in mathematica
我会写一些相关的代码。我首先(再次)提到我将定义并使用我自己的非交换运算符,以避免来自内置 NonCommutativeMultiply 的模式匹配问题。此外,我将使用 a[...] 而不是 Subscript[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 > i,你就可以规范化,比如在所有表达式中将 a[i] 放在 a[j] 之前。为此,您需要修改标记为 (!!!) 的规则以考虑此类换向器。
我应该补充一点,我在任何意义上都没有完全测试过上面的代码。
丹尼尔·利希特布劳
Wolfram 研究