Reputation: 159
The expressions I am working with are much too complicated to fully enter here, but I've included a simple examples that highlights the problem I am running into. I am hoping there is someone out there with enough programming fortitude to help me around this issue. Let me preface this by saying I have little to no background in programming in general, but I know the basics of Mathematica. Any and all help is greatly appreciated. Suppose I have set up the following functions:
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])
I have set up A[x,y,z]
with the rules for X[x]
, Y[y]
, and Z[z]
so that it can handle the case where x,y,z == 0
, i.e. when x == 0
I want all expressions in A[x,y,z]
with x
to go to zero or be neglected including Log[x]
. I've defined a function B[x,y,z]
that involves the partial derivatives of A[x,y,z]
. Now, I want the result so that B[0,y,z]
yields
yLog[y]-y(1+Log[y])+zLog[z]-z(1+Log[z])
that is to basically go back and make A[x,y,z]:= Y[y]+Z[z]
but instead I am currently running into the following, understandable, error:
Infinity::indet: Indeterminate expression 0 (-[Infinity]) encountered. >>
There must be some way around this with Mathematica and I am wondering if it will involve the Hold function or something related. Thank you all for the help.
Upvotes: 1
Views: 266
Reputation: 6884
One way is to use dummy variables in the derivatives, and replace afterward with the actual values.
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]) *)
This works because each derivative has a factor of 0. A more general solution might involve defining UpValues
on X, Y, Z
for handling derivatives at the origin (I don't have time to check this at the moment).
Upvotes: 6