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: [mg115727] Re: Using FindRoot on an equation involving Log terms
  • From: DrMajorBob <btreat1 at austin.rr.com>
  • Date: Wed, 19 Jan 2011 05:27:45 -0500 (EST)

The function's derivative at the root is rather large, so an accurate  
solution requires a bit of work.

It needn't be this verbose, but here's an approach that works well when  
the plot is well-behaved:

Clear[expr]
expr[x_] =
   110.52499999999998 + (300. - 135.52499999999998/(1 - x)) (1 - x) -
    300. x - 135.52499999999998 Log[1 - x] +
    135.52499999999998 Log[x];
p0 = Plot[expr@x, {x, 0, 1}];
pt1 = First@Cases[p0, Line[pts_List] :> pts, Infinity];
p1 = ListPlot[pt1, PlotRange -> All];
pt2 = pt1 /. {x_, y_} -> {x, Abs@y};
p2 = ListPlot@pt2;
sorted = SortBy[pt2, Last];
x0 = sorted[[1, 1]]
root = x /. FindRoot[expr@x, {x, x0}]

0.849313

0.849823

expr /@ {x0, root}

{-0.235046, -2.84217*10^-14}

expr'[root]

461.91

Notice the large derivative and how far off (vertically) is the plot's  
closest point to the root.

highLow = {root, #} & /@ pt1[[{1, -1}, -1]];
Show[p0, p1, p2, Graphics@{Thick, Red, Line@highLow}]

Bobby

On Tue, 18 Jan 2011 04:51:50 -0600, Andrew DeYoung  
<adeyoung at andrew.cmu.edu> 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
>
> FindRoot[expr, {x, 0.7}]
>
> do I get the seemingly "correct" root: {x -> 0.849823}.
>
> 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
>


-- 
DrMajorBob at yahoo.com


  • Prev by Date: Re: Using FindRoot on an equation involving Log terms
  • Next by Date: Context Woes (questions!) in application design...
  • Previous by thread: Re: Using FindRoot on an equation involving Log terms
  • Next by thread: Re: Using FindRoot on an equation involving Log terms