mathematica替换规则子表达式

时间:2013-05-02 20:18:50

标签: wolfram-mathematica rules replace

我使用了替换规则:

首先,我使用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时更换错误,那么我做错了什么?

2 个答案:

答案 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)

这给了我想要的结果,并使用更深层次的替代。