为什么即使只使用一个规则和一个表达式,Replace和ReplaceAll也会给出不同的结果?

时间:2011-07-26 21:23:36

标签: wolfram-mathematica

也许有人可以向我解释为什么Replace会给出与ReplaceAll不同的答案,即使我使用的是一条规则,而且我认为我有一个表达式。

根据文件:

ReplaceAll looks at each part of expr, tries all the rules on it, and then goes on to 
the next part of expr. The first rule that applies to a particular part is used; no 
further rules are tried on that part, or on any of its subparts

和替换

A list of rules can be given. The rules are tried in order. The result of the first 
one that applies is returned. If none of the rules apply, the original expr is 
returned.

我有这个表达:

z/(0.5 -1.4 z+z^2)

和这一条规则

z -> Exp[I*w]

以下输入

Clear[z]
hz = z/(0.5 - 1.4 z + z^2);
Replace[hz, z -> Exp[I*w]]
ReplaceAll[hz, z -> Exp[I*w]]

得出这个结果:

z/(0.5 -1.4 z+z^2)                    (*from Replace*)
E^(I w)/(0.5 -1.4 E^(I w)+E^(2 I w))  (*from ReplaceAll*)

所以,ReplaceAll完成了我预期的工作,但不是Replace。我认为我唯一想念的就是表达部分。那么也许hz不是'一个'表达?好的,很好,但它应该能够将规则至少应用到它的一部分。但它没有在任何地方做任何替换

FullForm[hz]
Times[z,Power[Plus[0.5`,Times[-1.4`,z],Power[z,2]],-1]]

不是一个表达式吗?如果没有,它有多少部分?它是TreeForm[hz]生成的图表末尾的叶子数量吗?如果是这样,那么我在那里看到3'z',然后Replace[]应该替换其中一个

enter image description here

我总是使用/.而不考虑它,这与ReplaceAll相同,但现在我使用Replace[]思考与/.相同,我发现这并注意到了不同的功能。 (这么多功能需要学习,所以时间很少:)。

2 个答案:

答案 0 :(得分:16)

事实上,ReplaceReplaceAll 相同。您可以将Replace视为更精确的版本,因为使用Replace,您可以指定要在其上进行替换的表达式级别。这里的差异有点类似于MapMapAll之间的区别,除了ReplaceAll不能深度优先工作的细微之处(见下文)。另一个差异,也是相当微妙的,Replace采用Heads选项,而ReplaceAll没有,这使得ReplaceReplaceAll更精确。< / p>

默认情况下,Replace仅在<0级 <0>,即整个表达式。但是z更深了:

In[220]:= Clear[z]
hz = z/(0.5 - 1.4 z + z^2);


Position[hz, z]

Out[222]= {{1}, {2, 1, 2, 2}, {2, 1, 3, 1}}

如果您使用Replace的级别规范,您可以获得与ReplaceAll类似但不总是相同的效果:

In[223]:= Replace[hz,z->Exp[I*w],{0,Infinity}]

Out[223]= E^(I w)/(0.5\[VeryThinSpace]-1.4 E^(I w)+E^(2 I w))

Replace与lev.spec {0,Infinity}ReplaceAll之间的区别在于前者在表达式之前执行深度优先的子表达式,而后者在较大的表达式中运行到部分。例如更详细地讨论它。 here。可以在this帖子中找到将这种差异用于一个优势的一个例子。

回到Replace的默认行为,它对整个表达式进行操作:当你只想转换整个表达式但它没有任何部分(可能会意外地匹配你规则中的模式)时,它非常有用)。 Replace的此类应用的一个示例是here

答案 1 :(得分:9)

我认为Replace文档的相关部分是:“在尝试转换整个表达式expr时应用规则或规则列表。”即转换整个表达。因此,

Replace[z, z -> Exp[I*w]]

会将z转换为Exp[I*w],但您的示例会失败,因为该规则与整个表达式不匹配。

请注意Replace接受参数level spec;所以要在树的末端叶子上操作,试试

Replace[hz, z -> Exp[I*w], -1]

E^(I w)/(0.5 -1.4 E^(I w)+E^(2 I w))