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>