MathGroup Archive 2004

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Derivatives of user-defined control-flow functions

  • To: mathgroup at smc.vnet.net
  • Subject: [mg51096] Re: Derivatives of user-defined control-flow functions
  • From: ab_def at prontomail.com (Maxim)
  • Date: Mon, 4 Oct 2004 06:18:17 -0400 (EDT)
  • References: <cjoiel$al2$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

"Maxim A. Dubinnyi" <maxim at nmr.ru> wrote in message news:<cjoiel$al2$1 at smc.vnet.net>...
> Can anyone correctly define derivatives of
> user-defined control-flow functions?
> 
> The derivative of build-in control function 'If' is evaluated as:
> 
> In[]=  D[If[f[x], g[x], h[x]], x]
> Out[]= If[f[x],g'[x],h'[x]]
> 
> Which is perfectly correct answer. I wish to introduce my own
> control flow function MyIf and define it's derivatives with
> properties identical to ones in build-in If function.
> Usually derivatives are defined via properties of
> symbol 'Derivative' by setting
> 
> Derivative[order...][function_name]:= (derivative definition)
> 
> but this method fails in case of control-flow expressions.
> The problem origin is in the rule for derivatives of
> composite functions:
> 
> In[]=  D[f[g[x]], x]
> Out[]= f'[g[x]]g'[x]
> 
> This rule should not be applied if 'f' is control-flow function such
> as 'If', 'Which', etc, and it is really so for build-in control-flow
> expressions. But how can I suppress this deepely build-in rule for
> some user-defined symbols?
> 
> I am experienced user of Mathematica, and I use widely symbolic
> and functional programming in my applications,
> but can't find any solution of this problem.
> 
> Is it the task which can't be solved by means of Mathematica
> symbolic programming language?
> 
> 
> Maxim A. Dubinnyi

You can add a definition for D:

In[1]:=
Clear[myIf]
myIf /: D[myIf[a_, b_, c_], vars__] := myIf[a, D[b, vars], D[c, vars]]

D[myIf[a[x, y], x^2, -x^2], {x, 2}]

Out[3]=
myIf[a[x, y], 2, -2]

If you need the definitions for Derivative, you can look at how it is
done for If and emulate it:

In[4]:=
Clear[myIf]
myIf /: Derivative[1, 0, 0][myIf] = 0&;
myIf /: Derivative[0, 1, 0][myIf] = myIf[#, 1, 0]&;
myIf /: Derivative[0, 0, 1][myIf] = myIf[#, 0, 1]&;

D[myIf[a[x, y], x^2, -x^2], {x, 2}]

Out[8]=
-2 myIf[a[x, y], 0, 1] + 2 myIf[a[x, y], 1, 0]

(If you omit TagSet, then the definitions will be stored as SubValues
for Derivative, which can be pretty confusing). Notice that while
Mathematica's rule for the differentiation of If can be handy, it is,
strictly speaking, not correct; for example:

In[9]:=
D[If[x == 0, 0, Sin[x]^2/x], x]

Out[9]=
If[x == 0, 0, (2*Sin[x]*Cos[x])/x - Sin[x]^2/x^2]

while the correct value for the derivative at zero is 1.

Maxim Rytin
m.r at inbox.ru


  • Prev by Date: Re: 3D data set
  • Next by Date: Re: Problem with Maximize and conditions.
  • Previous by thread: Re: Derivatives of user-defined control-flow functions
  • Next by thread: Re: Re: Derivatives of user-defined control-flow functions