0

我有使用替换规则:

首先,我使用 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那么,如果我想在评估步骤中每次发生时都被替换,我做错了什么?

4

2 回答 2

0

我玩了一点 Hold[]-Functions,得到了一个适合我的解决方案。

首先,我持有每个 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)

这给了我想要的结果,并且可以进行更深层次的替换。

于 2013-05-03T11:17:50.463 回答
0

在你In[26]的评估者已经根据你在(你写的)看到它 d之前为它建立的规则重写了它。ReplaceRepeated//.

Mathematica 的求值器非常贪婪且优先级较低,因此in//.左侧的表达式已重写为//.In[26]

((b+c)^2/e^2+something)/(tmp-1)

在您的替换规则有机会运行之前。由于该表达式不包含任何d替换规则d->tmp,因此不使用。

你有很多选择。

da)您可以为例如d:=tmpd=tmp在这种情况下评估写一个新的表达式

(d^2+something)/(d-1)

会产生

(something + tmp^2)/(-1 + tmp)

b)您可以删除d通过评估制作的定义,d:=a/e并在您想要转换包括d.

c) 您可以研究函数的定义和使用,例如Hold[]HoldFirst[]以及涵盖 Mathematica 通常评估过程以及如何修改它的文档的那些部分。

d) 与 Mathematica 一样,还有其他方法可以实现您想要的,最佳选择将取决于您正在尝试做什么。

要回答您的特定问题,如果我希望在评估步骤期间每次发生 d 时都被替换,我做错了什么?:您正在定义重写规则d:=a/e并将其放入规则集中,以便在评估之后在会话中评估的任何表达式期间尝试。

编辑回应评论

d:=a/e不是临时替换,它是一个持续存在的定义,直到删除或替换或您关闭会话。通常,使用规则(例如您的d->tmp. 当然,Mathematica 就是这样,您可以将规则分配给变量,例如

rule1 = d->a/e

并以明显的方式使用它们

expression /. rule1

您可以定义规则列表

rule_list = {d->tmp, e->tmp2, f-> tmp3}

等等。

于 2013-05-02T22:28:19.277 回答