Using FindRoot on an equation involving Log terms
- To: mathgroup at smc.vnet.net
- Subject: [mg115721] Using FindRoot on an equation involving Log terms
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Wed, 19 Jan 2011 05:26:31 -0500 (EST)
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