2011-12-08 28 views
1

我有一個Mathematica表達式(稱爲expr),它是許多術語的總和。此外,我還有一個列表(稱爲var),其中包含某些可能出現在這些術語中的某些變量和函數。組合模式來收集術語

我想要做的第一件事就是提取包含大量變量和函數一定次數的條件。例如,如果var = {a, f[_]},那麼我可能想提取所有包含變量a一次的函數和函數f兩次。 f[f[a + b]]是滿足這些標準的術語的一個例子。

我想要做的第二件事是創建一個列表(稱爲輸出),其中包含原始表達式的所有項的一次。該列表應該根據它們包含var中指定的變量和函數的次數對術語進行分組。 爲var = {a, f[_]}輸出將output = {{sum of those terms containing 0 * a and 0 * f[_], "sum of..." 1 * a and 0 f, "sum of..." 2a 0f, ... }, {"sum of..." 0a 1f, "sum of..." 1a, 1f, ... }}

給出一個解決問題2,它是很容易解決的問題1:要提取表達的一定期限,你就必須從列表中挑選輸出正確的元素。出於這個原因,我試圖解決問題2.爲了保持清楚,我從一個簡單的表達式開始,只包含一個術語。首先,我生成的圖案

列表
expr = f[a + f[y]] 
var = {{a, 1}, {f[_], 3}} 
basicpattern[symbol_, n_, term_] = 
Hold[Table[Count[{term}, symbol, 10] == i, {i, 0, n}]] 
basicpattern[#1, #2, expr] & @@@ var // ReleaseHold 

輸出是

{{False, True}, {False, False, True, False}} 

的解釋是:變量發生一次時,函數f出現2次。 現在我想要在basicpattern中使用列表的外部產品來組合模式。然後,可以將新的模式列表與案例一起使用,從expr中選擇條件並將它們放入列表中。

我在這裏堅持:如何取一個列表裏面的名單外的產品?我猜對了

Outer[And, {{True, False}, {True, False, False, False}}, 1] 

但是這並沒有給出八項。

更新

隨着Sjoerd的幫助下,我來到了一個遠一點。

expr = f[a + f[y]]; 
var = {{a, 1}, {f[_], 3}}; 
basicpattern[symbol_, n_, term_] := 
Table[Hold[Count[{term}, symbol, 10]] == i, {i, 0, n}]; 
basicpattern[#1, #2, expr] & @@@ var; 
Outer[And, ##] & @@ %; 
test = %[[2, 3]] 
%// ReleaseHold 

給出作爲輸出

Hold[Count[{f[a + f[y]]}, a, 10]] == 1 && 
Hold[Count[{f[a + f[y]]}, f[_], 10]] == 2 
True 

的解釋是使f [A + F [Y]]包含一個時間和兩次F [_]。 外部產品是這些測試的列表。

假設我改變expr來

EXPR = F [A + F [Y]] + G [Z] + Y^2 - 13×+ 12A + AF [X]

我怎樣才能使用測試內容來收集包含一個和兩個f [_]的所有術語?

+2

你寫道:「這裏出錯了,Mathematica產生一個錯誤。 - 添加哪個錯誤,或添加(精確地)重現錯誤的代碼。優選兩者。 :-) –

+3

說實話,我並不清楚你想要達到什麼目的,但是從'var'和'rule'的格式來判斷,我認爲那是'allrules'中的第二個'/ @'應該是'@@@'。 – Heike

+0

@nilo de roock和Heike。感謝您的意見。事實上,錯誤來自使用/ @而不是@@@。我正在重寫我的問題,我認爲有必要徹底改寫它。規則是什麼?我必須包括我的舊帖子嗎?我能替換它嗎?或者我需要刪除這個話題並開始一個新話題? – sjdh

回答

1

你是一個很長的故事,但我猜你的問題可以歸結爲:

如何採取一個列表裏面的名單外的產品?

如果這是您想知道的唯一一件事,那麼您已經接近了。它可以這樣做:

booleanLists = {{True, False}, {True, False, False, False}}; 

Outer[And, ##] & @@ booleanLists 

(* ==> {{True, False, False, False}, {False, False, False, False}} *) 
+0

謝謝。有了這個,我更接近解決方案。我想沒有辦法以明確的方式說明問題。我會盡力更新我的問題。 – sjdh