Re: Using FindRoot on an equation involving Log terms

*To*: mathgroup at smc.vnet.net*Subject*: [mg115771] Re: Using FindRoot on an equation involving Log terms*From*: DrMajorBob <btreat1 at austin.rr.com>*Date*: Thu, 20 Jan 2011 06:30:38 -0500 (EST)

Newton's method computes x - f[x]/f'[x] at each iteration: Clear[expr] expr[x_] = 110.52499999999998 + (300. - 135.52499999999998/(1 - x)) (1 - x) - 300. x - 135.52499999999998 Log[1 - x] + 135.52499999999998 Log[x] // Rationalize // FullSimplify g[x_] = x - expr[x]/expr'[x] // FullSimplify; Plot[{expr@x, g[x]}, {x, 0, 1}] g has poles near .34 and .66, where expr'[x] is 0 at local minima/maxima. For Newton's method to work reliably all by itself, g should be a contraction, meaning Abs[g'[x]] < 1, in an interval containing both the root and the starting point. That's not true at most x in this case, as this plot will show: Plot[{1, Abs[g'[x]]}, {x, 0, 1}, PlotRange -> {0, 2}] Hence, you can't expect Newton to do a lot of good (except by luck) unless the starting point is between .8 and .95 (from the graph), or more accurately: FindRoot[Abs[g'[x]] == 1, {x, .8}] {x -> 0.795996} and FindRoot[Abs[g'[x]] == 1, {x, .95}] {x -> 0.942448} FindRoot is smarter than just "Newton's method", but we'd at least want to start above the local minimum near .66. FindRoot[expr@x == 0, {x, .7}] {x -> 0.849823} Bobby On Wed, 19 Jan 2011 04:26:31 -0600, Daniel Lichtblau <danl at wolfram.com> wrote: > Andrew DeYoung wrote: >> Hi, >> >> I am trying to find the root of a certain expression in Mathematica >> version 7: >> >> expr = 110.52499999999998 + (300. - 135.52499999999998/(1 - x)) (1 - >> x) - 300. x - 135.52499999999998 Log[1 - x] + 135.52499999999998 >> Log[x] >> >> It appears to plot fine, for example using Plot[expr, {x, 0, 1}]. The >> plot shows that there should be a root at about x=0.85. However, when >> I try to find this root, using for example the following: >> >> FindRoot[expr, {x, 0.5}] >> >> I get an error message: >> >> "FindRoot::lstol: The line search decreased the step size to within >> tolerance specified by AccuracyGoal and PrecisionGoal but was unable >> to find a sufficient decrease in the merit function. You may need >> more than MachinePrecision digits of working precision to meet these >> tolerances." >> >> and it prints a seemingly incorrect (according to the qualitative form >> of the plot) result: {x -> 0.344678}. Only if I use for example > > The plot also shows that 0.5 is not in the basin of attraction for > Newton's method to find the root, and that it will send one in the > direction of the local max which is around x=0.35 > > Other methods might work better. For example, if you provide two start > points that bracket a root, then Brent's method will be used and it will > successfully find this root. > > In[84]:= FindRoot[expr, {x, 0.5, .9}] > Out[84]= {x -> 0.849823} > > >> FindRoot[expr, {x, 0.7}] >> >> do I get the seemingly "correct" root: {x -> 0.849823}. > > The zone of attraction for the root is to the right of the local min, > which appears to be somewhere around x=0.65. > > >> Can you help me see why the FindRoot is getting stuck at {x -> >> 0.344678} when I use starting values far away from 0.7 or 0.8? I will >> ultimately want to find the roots of many similar functions, which may >> have more than one "actual" root, so it would be helpful if I could >> see why FindRoot[expr, {x, 0.5}] does not give {x -> 0.849823}. (also >> when I tried NSolve[expr==0,x], Mathematica will not solve it.) >> >> Thank you, >> >> Andrew DeYoung >> Carnegie Mellon University > > Solve or NSolve with restrictions on the domain will handle this (in > version 8). > > In[82]:= Solve[{expr == 0, 0 <= x <= 1}, x] > Out[82]= {{x -> 0.849823}} > > Daniel Lichtblau > Wolfram Research > -- DrMajorBob at yahoo.com