2011-12-08 30 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