Nas*_*ser 11 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
Run Code Online (Sandbox Code Playgroud)
并为替换
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.
Run Code Online (Sandbox Code Playgroud)
我有这个表达式:
z/(0.5 -1.4 z+z^2)
Run Code Online (Sandbox Code Playgroud)
这一条规则
z -> Exp[I*w]
Run Code Online (Sandbox Code Playgroud)
以下输入
Clear[z]
hz = z/(0.5 - 1.4 z + z^2);
Replace[hz, z -> Exp[I*w]]
ReplaceAll[hz, z -> Exp[I*w]]
Run Code Online (Sandbox Code Playgroud)
产生这个结果:
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*)
Run Code Online (Sandbox Code Playgroud)
所以,ReplaceAll
做了我期望的工作,但没有Replace
.我认为我唯一想念的就是表达部分.那么也许hz不是'一个'表达?好的,很好,但它应该能够将规则至少应用到它的一部分.但它在任何地方都没有做任何替换
FullForm[hz]
Times[z,Power[Plus[0.5`,Times[-1.4`,z],Power[z,2]],-1]]
Run Code Online (Sandbox Code Playgroud)
是不是一个表达式?如果没有,它有多少部分?它是由生成的图表末尾的叶子数量TreeForm[hz]
?如果是这样,那么我在那里看到3'z',然后Replace[]
应该替换其中一个
我总是在/.
不考虑它的情况下使用它,它是一样的ReplaceAll
,但是现在我用的Replace[]
思维是一样的/.
,我发现了这一点并注意到了不同的功能.(学习这么多功能,所以很少的时间:)
Leo*_*rin 16
事实上,Replace
和ReplaceAll
是不一样的.您可以将其Replace
视为更精确的版本,因为Replace
您可以在表达式中指定要进行替换的级别.这里的区别是之间有点类似于Map
和MapAll
,除了微妙ReplaceAll
不起作用深度优先(见下文).另一个不同之处,也相当微妙,是Replace
取Heads
选项,而ReplaceAll
没有,这让Replace
还比更精确ReplaceAll
.
默认情况下,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}}
Run Code Online (Sandbox Code Playgroud)
如果使用级别规范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))
Run Code Online (Sandbox Code Playgroud)
之间的区别Replace
与lev.spec {0,Infinity}
并且ReplaceAll
是前者的行为深度优先,表达式之前的子表达式,而从更大的表达自己的部分后的作品.这里将更详细地讨论它.在这篇文章中可以找到这种差异用于一个人的优势的一个例子.
回到默认行为Replace
,它对整个表达式进行操作:当你只想转换整个表达式时,它非常有用,但它不是任何部分(可能与你的规则中的模式意外匹配).这种应用的一个例子Replace
就在这里.
我认为文档的相关部分Replace
是:"在尝试转换整个表达式expr时应用规则或规则列表."即转换整个表达式.从而,
Replace[z, z -> Exp[I*w]]
Run Code Online (Sandbox Code Playgroud)
会转换z
为Exp[I*w]
,但您的示例失败,因为规则与整个表达式不匹配.
注意这Replace
是一个参数level spec
; 所以要在树的末端叶子上操作,试试吧
Replace[hz, z -> Exp[I*w], -1]
Run Code Online (Sandbox Code Playgroud)
给
E^(I w)/(0.5 -1.4 E^(I w)+E^(2 I w))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1314 次 |
最近记录: |