我使用了替换规则:
首先,我使用SetDelayed
定义了一些简单的公式a:=b+c
d:=a/e
评估以下等式给出了预期的结果:
In[20]:= (d^2 + something)/(d - 1)
Out[20]= ((b+c)^2/e^2+something)/((b+c)/e-1)
但如果我想用另一个术语代替“d”,让我们说“tmp”,我得到以下内容:
In[26]:= (d^2+something)/(d-1)//.d->tmp
Out[26]= ((b+c)^2/e^2+something)/(tmp-1)
似乎变量“d”仅在未被“Power”之类的功能包围时才被替换。因此,d^2
一词并未被tmp
取代。
那么,如果我希望每次在评估步骤中发生d
时更换错误,那么我做错了什么?
答案 0 :(得分:0)
在您的In[26]
中,评估者根据您为d
建立的规则重新编写ReplaceRepeated
//.
(您已写为//.
)。
Mathematica的评估员非常贪婪且//.
的优先级相当低,因此In[26]
中((b+c)^2/e^2+something)/(tmp-1)
左侧的表达式已被重写为
d
在您的替换规则有机会运行之前。由于此表达式不包含d->tmp
,因此未使用替换规则d
。
你有很多选择。
a)你可以为d:=tmp
写一个新的表达式,例如d=tmp
或(d^2+something)/(d-1)
,在这种情况下评估
(something + tmp^2)/(-1 + tmp)
将产生
d
b)您可以删除评估d:=a/e
时所做的d
定义,只需在转换包含Hold[]
的表达式时使用替换规则。
c)您可以研究HoldFirst[]
和d:=a/e
等函数的定义和使用,以及文档中涵盖Mathematica常用评估过程以及如何修改它的部分。
d)像往常一样,Mathematica会有其他方法来实现你想要的,最好的选择将取决于你想要做什么。
要回答您的特定问题如果我希望每次在评估步骤中更换d时,我做错了什么?:您正在定义重写规则d:=a/e
和将其置于要评估之后在会话中评估的任何表达式的规则集中。
编辑以回应评论
d->tmp
不是临时替代品,它是一个定义,在删除或替换之前会持续存在,或者您关闭会话。通常,使用规则(例如您的rule1 = d->a/e
。当然,Mathematica就是它可以为变量分配规则,例如
expression /. rule1
并以明显的方式使用它们
rule_list = {d->tmp, e->tmp2, f-> tmp3}
您可以定义规则列表
{{1}}
等等。
答案 1 :(得分:0)
我使用Hold [] - 函数玩了一下,得到了一个对我有用的解决方案。
首先,我保留每个SetDelayed-term
a:=Hold[b+c]
d:=Hold[a/e]
构造完整的等式,我使用以下命令在计算之前替换几个变量。因此我使用Nest []函数将它们替换为不同的级别:
In[338]:= expression=Hold[(d^2+something)/(d-1)];
Nest[ReleaseHold[#//.HoldPattern[d]->tmp]&,expression,10]
Out[339]= (something+tmp^2)/(tmp-1)
这给了我想要的结果,并使用更深层次的替代。