【问题标题】:Why do Replace and ReplaceAll give different results even when only one rule and one expression is used?为什么即使只使用一个规则和一个表达式,Replace 和 ReplaceAll 也会给出不同的结果?
【发布时间】:2011-07-26 21:23:35
【问题描述】:

也许有人可以向我解释为什么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]]

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

我一直用/.不假思索,和ReplaceAll一样,但现在我用Replace[]的想法和/.一样,我发现了这个并注意到了不同的功能。 (要学习的功能太多,时间太少:)

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    事实上,ReplaceReplaceAll相同的。您可以将Replace 视为更精确的版本,因为使用Replace 您可以在表达式中指定您希望发生替换的级别。这里的区别有点类似于MapMapAll 之间的区别,除了ReplaceAll 不工作深度优先的微妙之处(见下文)。另一个同样微妙的区别是Replace 采用Heads 选项,而ReplaceAll 没有,这使得ReplaceReplaceAll 更精确。

    默认情况下,Replace在第 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

    【讨论】:

      【解决方案2】:

      我认为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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-30
        相关资源
        最近更新 更多