MathGroup Archive 2000

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

Search the Archive

Re: iterations, recursions and derivatives

  • To: mathgroup at smc.vnet.net
  • Subject: [mg22562] Re: [mg22544] iterations, recursions and derivatives
  • From: Hartmut Wolf <hwolf at debis.com>
  • Date: Sat, 11 Mar 2000 17:52:37 -0500 (EST)
  • Organization: debis Systemhaus
  • References: <200003090824.DAA20535@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Otto Linsuain schrieb:
> 
>  Hello. I find it hard to define a sequence of functions recursively and
> be able to differenciate them at the same time. For example
> 
>  f[x_,1]:=x^2
> 
>  Try to differentiate Derivative[1,0][f][2,1] will not work. Changing :=
> for = doesn't help. Can do:
> 
>  f[x_,1_]:=x^2    Notice the _ after the 1  (Kind of wierd, isn't it?)
> 
>  Now, however, can differentiate: Derivative[1,0][f][2,1] works fine.
> But cannot work recursions:
> 
>  f[x_,m_]:= SomeOperation[f[x,m-1]]  confuses the recursion process. I
> have tried defining
> 
>   f[x_,m_]:=If[m==1,x^2,SomeOperation[f[x,m-1]], but the recursion again
> crashes.
> 
>   I have tried Which, Switch, Condition, Dt, D, etc, but to no avail.
> When I can take the derivative, I can't update m to m+1.
> 
>  Any suggestions? Thanks, Otto Linsuain.



Dear Otto,

indeed things can't work that way. Let's look at what you did:

In[2]:= f[x_, 1] := x^2

In[3]:= Derivative[1, 0][f][2, 1]
Out[3]= Derivative[1, 0][f][2, 1]   

(I converted the output to InputForm) Nothing happed! Why?
Taking the Derivative[1, 0] of the function, meams to effectively
do:

In[4]:=
Derivative[1, 0][(Evaluate[f[x, y] /. {x -> #1, y -> #2}] &) ][2, 1]
Out[4]= Derivative[1, 0][f][2, 1]

Now we see the cause: the second slot of your function as defined cannot 
be filled with #2 to take the derivative, it's only '1' that can match
there.
In contrast this works:

In[5]:=
Derivative[1, 0][(Evaluate[f[x, 1] /. {x -> #1}] &) ][2]
Out[5]= 4
 
Having understood this, we can devellop solutions to your problem:

In[7]:= f[1][x_] := x^2/2      (* made a small change *)

In[8]:= Derivative[1][f[1]]
Out[8]= #1 &

Works!

Now let's define our recursive engine:

In[9]:= Attributes[SomeOperation] = {HoldAll};

In[10]:= SomeOperation[f[n_][x_]] := x/(n + 2)  f[n][x]

In[11]:= f[m_][x_] := SomeOperation[f[m - 1][x]] 

In[12]:= ?f
"Global`f"
f[1][x_] := x^2/2
 
f[m_][x_] := SomeOperation[f[m - 1][x]]


So let's produce something:

In[13]:= Table[f[n][x], {n, 10}]
Out[13]=
{x^2/2, x^3/6, x^4/24, x^5/120, x^6/720, x^7/5040, 
  x^8/40320, x^9/362880, x^10/3628800, x^11/39916800}

In[14]:= Table[Derivative[n][f[8]][x], {n, 10}]
Out[14]=
{x^8/40320, x^7/5040, x^6/720, x^5/120, x^4/24, x^3/6, 
  x^2/2, x, 1, 0}
 

An alternative would be to take the derivative (with D), 
in a better controlled way:

In[15]:= Clear[f]

In[16]:= f[x_, 1] := x^2/2

In[17]:= D[f[x, 1], x]
Out[17]= x

In[18]:= SomeOperation[f_[x_, n_]] := x/(n + 2) f[x, n]

(The attribute HoldAll is still in effect.)

In[19]:= f[x_, m_] := SomeOperation[f[x, m - 1]] 

In[20]:= ?f
"Global`f"
f[x_, 1] := x^2/2
 
f[x_, m_] := SomeOperation[f[x, m - 1]]


In[21]:= Table[f[x, n], {n, 10}]
Out[21]=
{x^2/2, x^3/6, x^4/24, x^5/120, x^6/720, x^7/5040, 
  x^8/40320, x^9/362880, x^10/3628800, x^11/39916800}

In[22]:= Table[D[f[x, 8], {x, n}], {n, 10}]
Out[22]=
{x^8/40320, x^7/5040, x^6/720, x^5/120, x^4/24, x^3/6, 
  x^2/2, x, 1, 0}
 

Now let's look at the other problem you encountered:

In[23]:= Clear[f]

In[24]:= f[x_, 1_] := x^2        (* kind of weird, isn't it? *)

You missed to look at what you had got:

In[25]:= ?f
"Global`f"
f[x_, _] := x^2

So this explains why your derivative seemingly worked, and why your
recursion ran away.


Kind regards,  Hartmut


  • Prev by Date: Re: Matrices & Compile
  • Next by Date: Re: export graphic to ps---trouble with fonts
  • Previous by thread: Re: iterations, recursions and derivatives
  • Next by thread: Re: iterations, recursions and derivatives