Re: Defining a derivative that distributes for a function
- To: mathgroup at smc.vnet.net
- Subject: [mg64257] Re: [mg64222] Defining a derivative that distributes for a function
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Wed, 8 Feb 2006 03:53:50 -0500 (EST)
- References: <200602070835.DAA29828@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
On 7 Feb 2006, at 08:35, Andres Corrada-Emmanuel wrote:
> Hello,
>
> I'm trying to define a derivative for a function that distributes:
>
> D[f[expr_],x_] ^:= f[D[expr,x]]
>
> This gives me:
>
> D[f[x^2],x] = f[2x]
>
> and
>
> D[f[x^4],x] = f[4x^3]
>
> But D[f[x^2] + f[x^4],x] = 2xf'[x^2] + 4x^3f'[x^4] instead of the
> desired:
>
> D[f[x^2] + f[x^4],x] = f[2x] + f[4x^3]. Why? And how do I get the
> desired behaviour.
The reason is that the pattern in the rule you have defined does not
match the expression you are differentiating so the built-in rules
for D (distributivity with respect to addition and the chain rule)
are triggered off and once they are applied it is too late to apply
your rule.
At the moment the only way I can see to get the desired behaviour is
by using a slightly unpleasant trick, which involoves a global
variable and Unprotecting D:
In[1]:=
flag = True;
In[2]:=
Unprotect[D];
In[3]:=
D[expr_, x_] /; flag := ReleaseHold[Block[{flag = False},
D[expr /. f[t_] :> Hold[f[t]], x] /. HoldPattern[D[Hold[f[v_]],
u_]] :> f[D[v, u]]]]
In[5]:=
Protect[D];
In[6]:=
D[f[x^2], x]
Out[6]=
f[2*x]
In[7]:=
D[f[x^2] + f[x^4], x]
Out[7]=
f[2*x] + f[4*x^3]
Andrzej Kozlowski
>
> --------------------------------------
> Andres Corrada-Emmanuel
> Lecturer in Physics
> Physics Department
> University of Massachusetts at Amherst
> --------------------------------------
>
- References:
- Defining a derivative that distributes for a function
- From: Andres Corrada-Emmanuel <acorrada@physics.umass.edu>
- Defining a derivative that distributes for a function