2011-02-03 2 views
4

У меня есть некоторые выражения в 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] 

ответ

6

Трудно получить и сохранить эту форму, если вы установите e1 быть х + у. Поэтому, если вам это действительно не нужно, вместо этого вы можете работать с правилами замены.

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 Лихтблау Wolfram Research

2

Ваш ответ, как представляется, конкретно из-за простой формы вашего e1 и e2. Одна из возможностей состоит в определении 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] 

Я полагаю, этот подход может масштабироваться до большего числа суб-выражений.

НТН

Смежные вопросы