MathGroup Archive 2011

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

Search the Archive

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


  • Prev by Date: Re: avoiding non-machine numbers
  • Next by Date: Re: Array of arrays of various sizes and compile
  • Previous by thread: Re: Using FindRoot on an equation involving Log terms
  • Next by thread: Re: Using FindRoot on an equation involving Log terms