MathGroup Archive 2004

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

Search the Archive

Re: How Many Users Are Happy With FindRoot?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg49170] Re: [mg49150] How Many Users Are Happy With FindRoot?
  • From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
  • Date: Tue, 6 Jul 2004 03:33:35 -0400 (EDT)
  • References: <200407050854.EAA14774@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

On 5 Jul 2004, at 17:54, David Park wrote:

> *This message was transferred with a trial version of CommuniGate(tm) 
> Pro*
> Dear MathGroup,
>
> I am continually being frustrated with the usage and performance of 
> FindRoot. Consider the problem of finding the roots lying between -3 
> Pi and 3 Pi of the following function.
>
> f[x_] = Tan[x] - (x/2)^2*Tanh[x];
>
> If we plot the function we can see why FindRoot runs into difficulty.
>
> Plot[f[x], {x, -3*Pi, 3*Pi}, Frame -> True,
>    Axes -> {True, False}, PlotRange -> {-15, 15}];
>
> If we pick starting values that are close enough we obtain the actual 
> roots.
>
> FindRoot[f[x], {x, {-7.5, -4, 2, 4, 7.5}}]
> {x -> {-7.78813, -4.51891, 0., 4.51891, 7.78813}}
>
> But I object to having to pick the initial values that closely. This 
> is not convenient and should not be necessary. If we pick the starting 
> values to just be in the middle of each branch, we only obtain one 
> correct root out of five.
>
> FindRoot[f[x], {x, {-2*Pi, -Pi, 0, Pi, 2*Pi}}]
> {x -> {-4.51891, 0., 0., 0., 4.51891}}
>
> With the algorithm that Mathematica uses there is no reason we should 
> expect any better. The root searching is jumping from branch to 
> branch. So let's confine it to a single branch. We obtain an error 
> message and an incorrect answer.
>
> FindRoot[f[x], {x, -2*Pi, -5*(Pi/2), -3*(Pi/2)}]
> {x -> -5.36881}
>
> It appears that in being ambitious enought to handle complex roots and 
> multiple equations FindRoot has skimped on finding real roots of real 
> equations. Mathematica should use more adaptive methods, perhaps using 
> bisection or other methods to locate roots in a fixed region. One 
> should not even have to give a starting point. These are probably the 
> most common applications of FindRoot and we should expect better 
> performance.
>
> There is a solution. There is a package in MathSource, 
> Enhancements`RootSearch`, by Ted Ersek. It is far better at handling 
> roots of real expressions.
>
> Needs["Enhancements`RootSearch`"]
>
> RootSearch[f[x] == 0, {x, -3*Pi, 3*Pi}]
> {{x -> -7.78813}, {x -> -4.51891}, {x -> 0.}, {x -> 4.51891}, {x -> 
> 7.78813}}
>
> This shouldn't be buried away in MathSource. It should be part of 
> Mathematica proper, on an equal par with FindRoot. It should be the 
> user's first choice for finding real roots of real equations. One 
> shouldn't spend time fumbling with FindRoot and then searching outside 
> Mathematica proper for a solution.
>
> David Park
> djmp at earthlink.net
> http://home.earthlink.net/~djmp/
>
>
I agree that Ted's package is nice, but Mathematica already included 
means of solving this sort of problem, e.g.


<< "NumericalMath`IntervalRoots`"


f[x_] = Tan[x] - (x/2)^2*Tanh[x];



IntervalBisection[f[x], x, Interval[{-3*N[Pi], 3*N[Pi]}],
   0.1, MaxRecursion -> 10]


Interval[{-7.8048942487621495, -7.7312631709436355},
   {-4.565126824747676, -4.491495746929162},
   {-0.07363107781851091, 0.07363107781851091},
   {4.491495746929162, 4.565126824747676},
   {7.7312631709436355, 7.8048942487621495}]


Andrzej Kozlowski
Chiba, Japan
http://www.mimuw.edu.pl/~akoz/


  • Prev by Date: RE : How Many Users Are Happy With FindRoot?
  • Next by Date: Re: Changing the Natural Sort Order
  • Previous by thread: How Many Users Are Happy With FindRoot?
  • Next by thread: Re: How Many Users Are Happy With FindRoot?