Wolfram mathematica 替换规则子表达式
我已使用替换规则: 首先,我使用SetDelayed定义了一些简单的公式Wolfram mathematica 替换规则子表达式,wolfram-mathematica,rules,replace,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)^
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
时都将其替换,那么我做错了什么呢?在[26]中的中,在替换重复之前(您编写为/.
),评估者已经根据您为其建立的规则重写了d
Mathematica的求值器非常贪婪,/.
的优先级相当低,因此[26]
中/.
左侧的表达式已重写为
((b+c)^2/e^2+something)/(tmp-1)
在替换规则有机会运行之前。由于此表达式不包含d
,因此替换规则d->tmp
未启用
你有很多选择
a) 您可以为d
编写一个新表达式,例如d:=tmp
或d=tmp
,在这种情况下
(d^2+something)/(d-1)
将产生
(something + tmp^2)/(-1 + tmp)
b) 您可以通过计算d:=a/e
来删除d
的定义,并且只要在需要转换包含d
的表达式时使用替换规则即可
c) 您可以学习函数的定义和使用,如Hold[]
和HoldFirst[]
以及文档中涵盖Mathematica常用评估过程和如何修改的部分
d) 与Mathematica一样,会有其他方法来实现您想要的,最佳选择将取决于您正试图做什么
要回答您的特定问题,如果我希望在每次求值步骤中发生d时都替换它,那么我做错了什么?您正在定义重写规则d:=a/e
,并将其放入规则集中,以便在以后会话中求值的任何表达式求值期间进行尝试
编辑以回应评论
d:=a/e
不是临时替换,它是一个定义,在移除或替换或关闭会话之前一直存在。通常,使用规则(比如你的d->tmp
)
rule1 = d->a/e
并以显而易见的方式使用它们
expression /. rule1
您可以定义规则列表
rule_list = {d->tmp, e->tmp2, f-> tmp3}
等等。我对Hold[]函数进行了一些操作,得到了一个适合我的解决方案
首先,每学期我都会坚持
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)
这使我得到了我想要的结果,并在更深层次上进行了替换。首先非常感谢您的快速回复。背景是我有许多不同的公式,这些公式被合并到最终方程中。为了对这个方程进行一些实验,我尝试临时设置一些部分公式(如d:=a/e)在不覆盖d项的情况下将其转换为常量变量。这就是为什么我尝试使用规则作为临时替换。使用Hold函数也是一个想法,但对我没有帮助。你知道如何处理这个问题吗?