在Mathematica中用名称替换表达式

4

我有一些在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个回答

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]

丹尼尔·利希特布劳 沃尔夫勒姆研究公司

2

由于你的e1e2的简单形式,你的答案似乎很具体。一种可能性是将e2定义为一个基于e1的函数,而不指定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]

我认为这种方法可以应用于更多的子表达式。

希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接