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

标签 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 .我认为我在这里缺少的唯一一件事是使 Parts 成为表达式的原因。所以也许 hz 不是“一个”表达?好的,很好,但它应该能够至少将规则应用于其中的一部分。但它没有在任何地方做任何替换
FullForm[hz]
Times[z,Power[Plus[0.5`,Times[-1.4`,z],Power[z,2]],-1]]

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

enter image description here

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

最佳答案

事实上,ReplaceReplaceAll不一样。你可以想到Replace作为更精确的版本,因为使用 Replace您可以在表达式中指定要进行替换的级别。这里的区别有点类似于Map之间的区别。和 MapAll ,除了 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 .

关于wolfram-mathematica - 为什么即使只使用一个规则和一个表达式, Replace 和 ReplaceAll 也会给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6836790/

相关文章:

wolfram-mathematica - 在 Mathematica 中重新定义下标

在 Mathematica/Mathlink 中计算导数

wolfram-mathematica - 如何在运行代码期间使 Mathematica 打印到控制台警告消息?

wolfram-mathematica - Mathematica 5 在 Mathematica 新版本中的 Mathematica 帮助浏览器

java - 在 Java 中获取 Mathematica 图像

loops - 在 Mathematica : multiple outputs 中循环

wolfram-mathematica - 处理下标变量

用案例选择

Java SystemClipboard 包含额外的字节

data-structures - Mathematica中的条件数据合并