初一些非常亲切计算器贡献者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 (\\.)
来处理这里提到的两个问题,但到目前为止我没有成功。
所有的想法,欢迎,感谢...
对于SetCommutative部分,我建议你看看我在前面的问题中提到的grassmanOps包。在那里他们有将变量定义为“费米子”(反通勤)和“玻色子”(通勤)的操作,并对NonCommutativeMultiply进行了修改,以检查该等级并将所有玻色子变量排在前面。 – Timo 2011-02-18 08:01:37