我有一个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