初一些非常親切計算器貢獻者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