我有一個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 [_]的所有術語?
你寫道:「這裏出錯了,Mathematica產生一個錯誤。 - 添加哪個錯誤,或添加(精確地)重現錯誤的代碼。優選兩者。 :-) –
說實話,我並不清楚你想要達到什麼目的,但是從'var'和'rule'的格式來判斷,我認爲那是'allrules'中的第二個'/ @'應該是'@@@'。 – Heike
@nilo de roock和Heike。感謝您的意見。事實上,錯誤來自使用/ @而不是@@@。我正在重寫我的問題,我認爲有必要徹底改寫它。規則是什麼?我必須包括我的舊帖子嗎?我能替換它嗎?或者我需要刪除這個話題並開始一個新話題? – sjdh