在Mathematica 7.0+中使用Subscript [variable,integer],我有以下形式的表达式:
a_-4 ** b_1 ** a_-4 ** b_-4 ** a_1 ** c_-4 ** c_1 ** c_5
我想简化这个表达式。
规则:
*具有相同下标的变量不通勤,
*具有不同下标的变量确实通勤。
我需要一种简化表达式并组合相似术语的方法(如果可能的话);输出应该是这样的:
(a_-4)^2 ** b_-4 ** c_-4 ** b_1 ** a_1 ** c_1 ** c_5
我需要的最重要的事情是通过下标对表达式中的术语进行排序,同时保留关于通勤和不通信的规则。第二件事(我想)做的是在订单正确后组合相似的术语。我需要至少按照以下方式对上面的表达式进行排序:
a_-4 ** a_-4 ** b_-4 ** c_-4 ** b_1 ** a_1 ** c_1 ** c_5,
即具有不同下标的通勤变量,同时保留具有相同下标的变量的非交际性质。
欢迎所有想法,谢谢。
答案 0 :(得分:2)
这是你要找的东西
可以推广这些类型的规则(例如,为非通信对象添加交换规则,使其处理非数字索引等等)并打包到NCMSort
例程中。您还可以通过定义唯一的NCMOrder
函数,在单个过程中进行排序来优化它,例如
NCMSort[expr_] := expr /. a_NonCommutativeMultiply :> a[[NCMOrder[a]]]
旁白: 我使用这样一个过程来生成arXiv:1009.3298的结果 - 笔记本将随着(即将发布)更长的论文一起发布。
答案 1 :(得分:2)
我前几天引用了一个图书馆笔记本来解决相关问题。
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>我,那么你可以规范化,比如在所有表达式中将[i]放在[j]之前。为此,您需要修改标记为( !!! )的规则以考虑此类换向器。
我应该补充一点,我在任何意义上都没有完全测试过上面的代码。
Daniel Lichtblau Wolfram Research
答案 2 :(得分:0)
您可以使用NCAlgebra执行所需操作。就你的例子而言:
<< NC`
<< NCAlgebra`
expr = Subscript[a, -4] ** Subscript[b, 1] ** Subscript[a, -4] ** Subscript[b, -4] ** Subscript[a, 1] ** Subscript[c, -4] ** Subscript[c, 1] ** Subscript[c, 5]
rule = {(Subscript[x_, i_] ** Subscript[y_, j_] /; i > j) -> Subscript[y, j] ** Subscript[x, i]}NCReplaceRepeated[expr, rule]
NCReplaceRepeated[expr, rule]
产生
Subscript[a, -4] ** Subscript[a, -4] ** Subscript[b, -4] ** Subscript[c, -4] ** Subscript[b, 1] ** Subscript[a, 1] ** Subscript[c, 1] ** Subscript[c, 5]
这里看起来不太好,但Subscripts
会很好地呈现在笔记本上。