2011-02-18 34 views
3

初一些非常亲切计算器贡献者in this post的协助负coeffcients,我对数学的NonCommutativeMultiply (**)以下新定义:非交换乘法和在表达的数学

Unprotect[NonCommutativeMultiply];
ClearAll[NonCommutativeMultiply]
NonCommutativeMultiply[] := 1
NonCommutativeMultiply[___, 0, ___] := 0
NonCommutativeMultiply[a___, 1, b___] := a ** b
NonCommutativeMultiply[a___, i_Integer, b___] := i*a ** b
NonCommutativeMultiply[a_] := a
c___ ** Subscript[a_, i_] ** Subscript[b_, j_] ** d___ /; i > j :=
c ** Subscript[b, j] ** Subscript[a, i] ** d
SetAttributes[NonCommutativeMultiply, {OneIdentity, Flat}]
Protect[NonCommutativeMultiply];

这乘法不过,它并不处理表达式开始处的负值,即
a**b**c + (-q)**c**a
应简化为
a**b**c - q**c**a
它不会。

在我的乘法中,变量q(和任何整数缩放器)是可交换的;我仍然试图编写一个SetCommutative函数,但没有成功。我不是绝望的需要SetCommutative,它会很好。

这也将是有益的,如果我能够全部q's拉每个表达式的开头,即,:
a**b**c + a**b**q**c**a
应该简化为:
a**b**c + q**a**b**c**a
同样,结合这两个问题:
a**b**c + a**c**(-q)**b
应该简化为:
a**b**c - q**a**c**b

目前,我想弄清楚如何在表达式开始时处理这些负面变量,以及如何将q's(-q)'s拉到前面。我试图用ReplaceRepeated (\\.)来处理这里提到的两个问题,但到目前为止我没有成功。

所有的想法,欢迎,感谢...

+1

对于SetCommutative部分,我建议你看看我在前面的问题中提到的grassmanOps包。在那里他们有将变量定义为“费米子”(反通勤)和“玻色子”(通勤)的操作,并对NonCommutativeMultiply进行了修改,以检查该等级并将所有玻色子变量排在前面。 – Timo 2011-02-18 08:01:37

回答

3

到这样做的关键是要认识到数学代表a-ba+((-1)*b),你可以从

In[1]= FullForm[a-b] 
Out[2]= Plus[a,Times[-1,b]] 

看到的第一部分,你的问题,所有你需要做的就是添加此规则:

NonCommutativeMultiply[Times[-1, a_], b__] := - a ** b 

或者你甚至可以从任何位置捕捉标志:

NonCommutativeMultiply[a___, Times[-1, b_], c___] := - a ** b ** c 

更新 - 第2部分与得到标器以正面的普遍问题是,在当前的规则图案_Integer只会发现事情是明显的整数。它甚至不会发现q是一个像Assuming[{Element[q, Integers]}, a**q**b]这样的结构中的整数。
要实现这一点,您需要检查假设,一个可能花费在全局转换表中的过程。相反,我会编写一个可以手动应用的转换函数(也可以从全局表中删除当前规则)。像这样的东西可能会奏效:

NCMScalarReduce[e_] := e //. { 
    NonCommutativeMultiply[a___, i_ /; [email protected][i, Reals],b___] 
    :> i a ** b 
} 

上面使用规则使用Simplify明确查询假设,你可以通过在全球分配给$Assumptions使用Assuming设置或本地:

Assuming[{q \[Element] Reals}, 
    NCMScalarReduce[c ** (-q) ** c]] 

回报-q c**c

HTH

2

只是一个快速的答案是重复一些来自前一个问题的意见。 您可以删除一对夫妇的定义和使用作用于Times[i,c]其中i是可交换并且c规则解决所有这些问题的部分有这那么按预期工作

Sequence[]

Unprotect[NonCommutativeMultiply]; 
ClearAll[NonCommutativeMultiply] 
NonCommutativeMultiply[] := 1 
NonCommutativeMultiply[a___, (i:(_Integer|q))(c_:Sequence[]), b___] := i a**Switch[c, 1, Unevaluated[Sequence[]], _, c]**b 
NonCommutativeMultiply[a_] := a 
c___**Subscript[a_, i_]**Subscript[b_, j_] ** d___ /; i > j := c**Subscript[b, j]**Subscript[a, i]**d 
SetAttributes[NonCommutativeMultiply, {OneIdentity, Flat}] 
Protect[NonCommutativeMultiply]; 

默认

In[]:= a**b**q**(-c)**3**(2 a)**q 
Out[]= -6 q^2 a**b**c**a 

请注意,您可以概括(_Integer|q)以处理更一般的交换对象。