2011-02-18 30 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)以處理更一般的交換對象。