Re: Problems with FindRoot and recursive functions
- To: mathgroup at smc.vnet.net
- Subject: [mg89742] Re: Problems with FindRoot and recursive functions
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Thu, 19 Jun 2008 05:45:17 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <g35g0m$9bv$1@smc.vnet.net> <48565C59.1040200@gmail.com> <g3agqp$plh$1@smc.vnet.net>
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}.
Daniel,
As far as I can tell, the recursion is fine. However, interactions
between FindRoot and your function might not be what you expect. (I
would say that having a continuous function is much better.) When fed
with one starting value, FindRoot uses Newton method, and with two
starting values, it uses a Secant method. We can follow the recursive
calls thanks to Trace[] and the option EvaluationMonitor allows us to
see what values of t are used by FindRoot[].
In[1]:= x1[t_?NumericQ] := If[t < 0, {t, 1}, 0.5 + x1[t - 1]]
FindRoot[x1[t][[1]] == 0, {t, 0.5}]
Out[2]= {t -> 0.}
In[3]:= Trace[x1[0.5]]
Out[3]= {x1[0.5], {NumericQ[0.5], True},
If[0.5 < 0, {0.5, 1}, 0.5 + x1[0.5 - 1]], {0.5 < 0, False},
If[False, {0.5, 1}, 0.5 + x1[0.5 - 1]], 0.5 + x1[0.5 - 1],
{{0.5 - 1, -0.5}, x1[-0.5], {NumericQ[-0.5], True},
If[-0.5 < 0, {-0.5, 1}, 0.5 + x1[-0.5 - 1]], {-0.5 < 0, True},
If[True, {-0.5, 1}, 0.5 + x1[-0.5 - 1]], {-0.5, 1}}, 0.5 + {-0.5, 1},
{0.5 - 0.5, 0.5 + 1}, {0.5 - 0.5, 0.}, {0.5 + 1, 1.5}, {0., 1.5}}
In[4]:= FindRoot[x1[t][[1]] == 0, {t, 0.5},
EvaluationMonitor :> Print["t = ", t]]
During evaluation of In[4]:= t = 0.5
During evaluation of In[4]:= t = 0.
Out[4]= {t -> 0.}
In[5]:= FindRoot[x1[t][[1]] == 0, {t, 0.3, 0.7},
EvaluationMonitor :> Print["t = ", t]]
During evaluation of In[5]:= t = 0.3
During evaluation of In[5]:= t = 0.7
During evaluation of In[5]:= t = 0.7
During evaluation of In[5]:= t = 0.3
During evaluation of In[5]:= t = 0.3
During evaluation of In[5]:= t = 0.
Out[5]= {t -> 0.}
Regards,
-- Jean-Marc
> 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
>>
>>
>