用Mathematica中的名称替换表达式

时间:2011-02-03 22:05:26

标签: wolfram-mathematica

我在Mathematica中有一些用其他表达式定义的表达式。我想采用较大表达式的一些函数,然后根据子表达式得到结果。例如:

In[78]:= e1 = x + y;
e2 = 2^e1;

In[80]:= D[e2, x]

Out[80]= 2^(x + y) Log[2]

我希望输出为2^e1 Log[2]。我目前正在使用ReplaceAll,如下所示,但在我的实际应用程序中使用大约20个子表达式时这很麻烦。

In[81]:= D[e2, x] /. e1 -> E1

Out[81]= 2^E1 Log[2]

2 个答案:

答案 0 :(得分:6)

如果将e1设置为x + y,则难以获取并保留该表单。因此,如果您真的不需要,可以使用替换规则。

rul = {e1->x+y, e2->2^e1};
revrul = {x+y->e1};

InputForm[D[e2//.rul, x] /. revrul]

Out[5]//InputForm= 2^e1*Log[2]

Daniel Lichtblau Wolfram Research

答案 1 :(得分:2)

由于e1e2的简单形式,您的回答似乎是具体的。一种可能性是根据e2e1定义为函数,而不指定e1是什么:

In[8]:= Clear[e1, e2];
e2[x_] := 2^e1[x]

然后

In[10]:= D[e2[x], x]

Out[10]= 2^e1[x] Log[2] Derivative[1][e1][x]

这是一个正确的答案。只要您想要计算,就可以为e1提供具体的定义。您也可以在Block中执行此操作,以便不引入全局定义:

In[11]:= 
Block[{e1},
  e1[x_] := x + y;
  D[e2[x], x]]

Out[11]= 2^(x + y) Log[2]

我认为这种方法可以扩展到更多的子表达式。

HTH