wolfram-mathematica - 数学: subscript simplification under noncommutative multiplication

标签 wolfram-mathematica

在 Mathematica 7.0+ 中使用下标[变量,整数],我有以下形式的表达式:

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,

即,交换具有不同下标的变量,同时保留具有相同下标的变量的非通信性质。

欢迎所有想法,谢谢。

最佳答案

前几天我引用了一本图书馆笔记本来回答相关问题。

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-mathematica - 数学: subscript simplification under noncommutative multiplication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4988323/

相关文章:

wolfram-mathematica - 操作方法 : ( and where ) define function aliases in Mathematica for usage in any new Notebook?

wolfram-mathematica - 如何在mathematica中显示字符矩阵

wolfram-mathematica - 在 Mathematica 中保留变量名称

wolfram-mathematica - 防止 "Plus"重新排列东西

dynamic - 为变量创建强大的实时监视器

colors - 在 Mathematica 中用不同颜色对特定点着色

colors - Mathematica 颜色函数缩放

wolfram-mathematica - 美元符号 $ 在内部有什么用?

statistics - 在 Mathematica 中计算自定义分布的期望

wolfram-mathematica - 给定两个数据列表,mathematica 中的数值积分