MathGroup Archive 1998

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

Search the Archive

Re: Possible bug in FindRoot[] in Mathematica 3.0



> Hi there,
> I think I've possibly found a bug in Mathematica 3.0. Consider the
> equation:
> 
>         2^x + 3^x = 5^x
> 
> Well, it's obvious that x = 1 is a solution, and you can check with
> Plot[] that x = 1 is indeed the only solution. When I try to Solve[]
> this with Mathematica, it says:
> 
> Solve::"tdep": 
>     "The equations appear to involve transcendental functions of the \
> variables in an essentially non-algebraic way."
> 
> This is fair enough - I have no idea how to solve this type of equation
> without some numerical method either. The problem comes when I try to
> use FindRoot:
> 
> In[83]:= FindRoot[2^x+3^x==5^x,{x,0}] Out[83]:= {x -> -21.1781}
> 
> -21? I'm sorry? Obviously, the iterative formula it has created
> (presumably by the Newton-Raphson process) for the equation diverges
> when the starting point is taken as x = 0. However, if I do something
> like this, it handles it correctly:
> 
> In[86]:= FindRoot[2^x+3^x==5^x,{x,-1}] FindRoot::"cvnwt": 
>     "Newton's method failed to converge to the prescribed accuracy after
> \
> 15 iterations."
> Out[86]:= {x -> -21.0059}
> 
> So, why does Mathematica correctly recognise that the iterative sequence
> does not converge in the second case, yet it doesn't recognise this in
> the first case and thus returns a totally bogus result without any
> error message?
> 
> This looks like a bug to me. Or am I just missing something here?
> 
> Thanks, cheers,
> Adrian Cable.

Well, no, this isn't a bug, but this behavior should probably be changed
anyway.  Any purely numerical algorithm, no matter how clever, can
always be fooled.  On the other hand, since it is possible with a bit
of work to change FindRoot so that it is fooled less often, it would be
good to make some improvements here regardless of whether or not this
is a bug.

FindRoot looks for a value of the variable such that the difference
between the right-hand side of the equation and the left-hand side of
the equation is less than 10^-n, where n is the value of the
AccuracyGoal option.  With the default WorkingPrecision of 16, the
default value of AccuracyGoal is 6.  The result from FindRoot in this
example is correct in the sense that it satisfies that specification.

In[1]:= sol = FindRoot[2^x+3^x==5^x,{x,0}]

Out[1]= {x -> -21.1781}

In[2]:= 2^x+3^x - 5^x /. sol

                  -7
Out[2]= 4.21538 10

If you raise the value of AccuracyGoal, then FindRoot will generate a
warning message, but if the number of iterations is also raised, the
message will again go away.

In[3]:= FindRoot[2^x+3^x==5^x,{x,0}, AccuracyGoal -> 10]

FindRoot::cvnwt: 
   Newton's method failed to converge to the prescribed accuracy after
15
     iterations.

Out[3]= {x -> -25.5059}

In[4]:= FindRoot[2^x+3^x==5^x,{x,0}, AccuracyGoal -> 10,
                                MaxIterations -> 100]

Out[4]= {x -> -34.162}

It is good to be careful about this sort of thing with any root-finding
algorithm.  It is always possible for a purely numerical algorithm to
return bogus results without warning.  There are, however, several ways
of reducing the chances of getting a bogus result that will probably be
incorporated into future versions of the FindRoot function.

Dave Withoff
Wolfram Research



  • Prev by Date: Re: Mathlink problem with lists of reals
  • Next by Date: Re: Help
  • Prev by thread: Re: Possible bug in FindRoot[] in Mathematica 3.0
  • Next by thread: Re: Possible bug in FindRoot[] in Mathematica 3.0