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.

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