Mathematica Evaluation Control и выражения - PullRequest
1 голос
/ 08 января 2012

Выражения, с которыми я работаю, слишком сложны, чтобы их можно было полностью ввести здесь, но я включил простые примеры, которые выдвигают на первый план проблему, с которой я сталкиваюсь.Я надеюсь, что есть кто-то с достаточной стойкостью программирования, чтобы помочь мне обойти эту проблему.Позвольте мне предвосхитить это, сказав, что у меня мало общего с программированием, но я знаю основы Mathematica.Любая помощь очень ценится.Предположим, я настроил следующие функции:

X[x_] := x Log[x]
X[0] := 0
Y[y_] := y Log[y]
Y[0] := 0
Z[z_] := z Log[z]
A[x_, y_, z_] := X[x] + Y[y] + Z[z]

In[7]:= A[x, y, z]

Out[7]= x Log[x] + y Log[y] + z Log[z]

In[8]:= B[x_, y_, z_] := 
 Evaluate[A[x, y, z] - x*D[A[x, y, z], x] - y*D[A[x, y, z], y] - 
   z*D[A[x, y, z], z]]

In[9]:= B[x, y, z]

Out[9]= x Log[x] - x (1 + Log[x]) + y Log[y] - y (1 + Log[y]) + 
 z Log[z] - z (1 + Log[z])

Я установил A[x,y,z] с правилами для X[x], Y[y] и Z[z], чтобы он мог обрабатывать случай, когда x,y,z == 0, т.е. когда x == 0 Я хочу, чтобы все выражения в A[x,y,z] с x обращались в ноль или игнорировались, включая Log[x].Я определил функцию B[x,y,z], которая включает в себя частные производные A[x,y,z].Теперь я хочу получить результат, чтобы B[0,y,z] давал

yLog[y]-y(1+Log[y])+zLog[z]-z(1+Log[z])

, то есть, по сути, возвращался и делал A[x,y,z]:= Y[y]+Z[z], но вместо этого я сейчас сталкиваюсь со следующей, понятной ошибкой:

Infinity :: indet: найдено неопределенное выражение 0 (- [Infinity]).>>

Должен быть какой-то способ обойти это с Mathematica, и мне интересно, будет ли это включать функцию Hold или что-то связанное.Спасибо всем за помощь.

1 Ответ

6 голосов
/ 08 января 2012

Один из способов - использовать фиктивные переменные в производных и впоследствии заменить их фактическими значениями.

Clear[X, Y, Z];
X[x_] := x Log[x]
X[0]   = 0;
Y[y_] := y Log[y]
Y[0]   = 0;
Z[z_] := z Log[z]
Z[0]   = 0;

A[x_, y_, z_] := X[x] + Y[y] + Z[z]    
B[x_, y_, z_] := 
 Module[{xx, yy, zz}, 
  A[x, y, z] - x*D[A[xx, y, z], xx] - y*D[A[x, yy, z], yy] - 
    z*D[A[x, y, zz], zz] /. {xx -> x, yy -> y, zz -> z}]

B[0, y, z]

(* Output: y Log[y] - y (1 + Log[y]) + z Log[z] - z (1 + Log[z]) *)

Это работает, потому что каждая производная имеет коэффициент 0. Более общее решение может включать определение UpValues на X, Y, Z для обработки производных в источнике (у меня нет времени проверять это в данный момент).

...