Re: Using FindRoot on an equation involving Log terms
- To: mathgroup at smc.vnet.net
- Subject: [mg115769] Re: Using FindRoot on an equation involving Log terms
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Thu, 20 Jan 2011 06:30:15 -0500 (EST)
Starting just below the local max can also give the correct answer (more or less by accident). For instance: expr = 110.52499999999998 + (300. - 135.52499999999998/(1 - x)) (1 - x) - 300. x - 135.52499999999998 Log[1 - x] + 135.52499999999998 Log[x]; << Optimization`UnconstrainedProblems` FindRootPlot[expr, {x, 0.28}, PlotRange -> {{0, 1}, {-100, 100}}] Bobby On Wed, 19 Jan 2011 04:26:20 -0600, Gabriel Landi <gtlandi at gmail.com> wrote: > Hey Andrew, > > The problem is likely the direction it uses to begin the search. > x = 0.655 is a minimum. If you give a initial value above that it finds > your > root. > If you give a initial value below that it will go the other way which > eventually diverges when x approaches zero. > > You can take a better look using the following two lines of code: > > << Optimization`UnconstrainedProblems` > > FindRootPlot[expr, {x, 0.6}, PlotRange -> {{0, 1}, {-100, 100}}] > > > (The output graph comes out bugged but you can still see what you need to > see: the steps it took). > > The colors are explained in > http://reference.wolfram.com/mathematica/tutorial/UnconstrainedOptimizationPlottingSearchData.html > > > By the way, FindInstance works: > > > > FindInstance[expr == 0, x, Reals] // N > > > Cheers, > > > Gabriel > > > > On Tue, Jan 18, 2011 at 8:51 AM, 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