MathGroup Archive 2008

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

Search the Archive

Re: Problems with FindRoot and recursive functions

  • To: mathgroup at smc.vnet.net
  • Subject: [mg89715] Re: Problems with FindRoot and recursive functions
  • From: dh <dh at metrohm.ch>
  • Date: Thu, 19 Jun 2008 05:40:12 -0400 (EDT)
  • References: <g35g0m$9bv$1@smc.vnet.net> <48565C59.1040200@gmail.com> <g3agqp$plh$1@smc.vnet.net>


Hi Daniel,

this looks like a pretty nasty bug of FindRoot. Consider:

x1[t_?NumericQ]:=If[t<0,{t,1},0.5+x1[t-1]];

f1[t_?NumericQ]:=x1[t][[1]];

FindRoot[x1[t][[1]]==0,{t,0.5}]

FindRoot[(f1[t]) == 0, {t, 0.5}]

this gives 0 and 0.5

It looks to me like x1[t][[1]] is symbolically evaluated to t (the first 

part of the expression) what would explain the result. However, this 

should not happen as FindRoot has the attribute HoldAll.

Please report this to Wolfram.

Daniel





Daniel Kuang Chen Liu wrote:

> To Jean-Marc and dh,

> 

> Forcing the use of numeric arguments still doesn't seem to work.

> The correct answer is {t -> 0.5} but we get {t -> 0} when we make the

> x1[t_?NumericQ] modification. NumericQ appears to stop the recursion process

> at {t,1}.

> 

> Thank you for the help.

> 

> Daniel Liu

> 

> On Mon, Jun 16, 2008 at 10:28 PM, Jean-Marc Gulliet <

> jeanmarc.gulliet at gmail.com> wrote:

> 

>> Daniel Kuang Chen Liu wrote:

>>

>>  I have a recursive function of the form

>>>  x1[t_] := If[t < 0, {t, 1}, 0.5 + x1[t - 1]]

>>> which returns a list of length 2, and the first element has a root at

>>> t=0.5

>>>

>>>> In[3]:= x1[0.5]

>>>>> Out[3]= {0., 1.5}

>>>>>

>>> I want to use FindRoot to determine t0 such that x1[t0][[1]] == 0, so I

>>> use

>>> the following code

>>>

>>>  FindRoot[x1[t][[1]] == 0, {t, 0.5}]

>>> to which Mathematica complains

>>>

>>> During evaluation of In[6]:= FindRoot::nlnum: The function value

>>> {False} is not a list of numbers with dimensions {1} at {t} = {0.5}.

>>>

>>> It would much appreciated if someone could tell me what is wrong with the

>>> code.

>>>

>> Hi Daniel,

>>

>> You just have to ensure that the function x1 is called for numeric values

>> only [1]. For instance,

>>

>>    x1[t_?NumericQ] := If[t < 0, {t, 1}, 0.5 + x1[t - 1]]

>>    FindRoot[x1[t][[1]] == 0, {t, 0.5}]

>>

>>    {t -> 0.}

>>

>> Regards,

>> - Jean-Marc

>>

>> [1] "How do I write a function which evaluates only when the argument is a

>> number?"

>> http://support.wolfram.com/mathematica/kernel/features/evalwhennumber.html

>>

>>

> 





-- 



Daniel Huber

Metrohm Ltd.

Oberdorfstr. 68

CH-9100 Herisau

Tel. +41 71 353 8585, Fax +41 71 353 8907

E-Mail:<mailto:dh at metrohm.com>

Internet:<http://www.metrohm.com>




  • Prev by Date: Several diverse questions
  • Next by Date: Re: Will adding RAM help "No more memory available" error?
  • Previous by thread: Re: Problems with FindRoot and recursive functions
  • Next by thread: Re: Problems with FindRoot and recursive functions