2011-02-14 73 views
1

下標簡化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, 

就是通勤變量不同標,同時保留具有相同標變量的非通信性質。

歡迎所有的想法,謝謝。

+0

您是否知道具有相同下標的對象的換向屬性?如果不是,那麼你不會得到表達式的獨特形式 - 並將它們組合將是不理想的。 – Simon 2011-02-14 02:58:20

回答

2

這是東西你正在尋找

Sort

這些類型的規則可以推廣(如增加減刑規則非交換對象,使其處理非數字指標,等等)的類型並打包成NCMSort例程。您也可以通過定義一個唯一的NCMOrder函數(例如,

NCMSort[expr_] := expr /. a_NonCommutativeMultiply :> a[[NCMOrder[a]]] 

的一旁: 我使用這樣的過程中產生的arXiv:1009.3298結果 - 筆記本將與(即將發佈)較長的紙張進行分配。

+1

我很想你認爲你種下了這個問題:) – Janus 2011-02-14 04:30:53

2

我引用了一個庫相關問題的筆記本日。

http://library.wolfram.com/infocenter/Conferences/325/

How to expand the arithematics of differential operators in mathematica

我嬰兒牀一些相關的代碼。我首先再次提到我要定義和使用我自己的非對易算子,以避免來自內置NonCommutativeMultiply的模式匹配問題。此外,我將使用[...]而不是下標[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>時我,那麼你可以規範化,通過將A [1]前[J]中的所有表情說。爲此,您需要修改標記的規則(!!!)以解釋此類換向器。

我應該補充一點,我還沒有完全測試過上述代碼。

丹尼爾Lichtblau 沃爾夫勒姆研究

0

你可以你想使用NCAlgebra什麼事。在您的例子中:

<< NC` 
<< NCAlgebra` 
expr = Subscript[a, -4] ** Subscript[b, 1] ** Subscript[a, -4] ** Subscript[b, -4] ** Subscript[a, 1] ** Subscript[c, -4] ** Subscript[c, 1] ** Subscript[c, 5] 
rule = {(Subscript[x_, i_] ** Subscript[y_, j_] /; i > j) -> Subscript[y, j] ** Subscript[x, i]}NCReplaceRepeated[expr, rule] 
NCReplaceRepeated[expr, rule] 

產生

Subscript[a, -4] ** Subscript[a, -4] ** Subscript[b, -4] ** Subscript[c, -4] ** Subscript[b, 1] ** Subscript[a, 1] ** Subscript[c, 1] ** Subscript[c, 5] 

它看起來並不那麼好看,但這裏將Subscripts很好地呈現在Notebook。