Re: sorting list of roots af a transcendental function
- To: mathgroup at smc.vnet.net
- Subject: [mg65276] Re: [mg65260] sorting list of roots af a transcendental function
- From: "Carl K. Woll" <carlw at wolfram.com>
- Date: Thu, 23 Mar 2006 06:58:42 -0500 (EST)
- References: <200603221113.GAA10232@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Dule wrote:
> Dear group,
>
> for calculating a model i need values for x which are given by the
> transcendental function Cot[x] == x/a - a/(4*x). a is a parameter 0<a<200.
> i obtained the roots with Table and FindRoot:
> Table[FindRoot[Cot[x] == x/a - a/(4*x), {x, i}], {i, 1, 50}]]
>
> I have two questions:
> 1. Is there a better way to do this?
> 2. How can i construct a list, where the values for x, which appear
> multiple are dropped?
>
> Thanks!
One method to find subintervals of an interval guaranteed to contain all
of the roots of a function f is to use the package IntervalRoots. With
this package, f must be able to accept an Interval object as an
argument, which is satisfied with your example. So, load the package:
Needs["NumericalMath`IntervalRoots`"]
We'll use IntervalBisection because your function is discontinuous. With
IntervalNewton, the roots are found more quickly, but the
discontinuities may cause some roots to be missed. The default value for
MaxRecursion is a bit low, so we'll increase it.
In[10]:=
With[{a = 10}, IntervalBisection[Cot[x] - x/a + a/(4*x), x,
Interval[{0, 50}], 0.1, MaxRecursion -> 30]]
Out[10]=
Interval[{2.24609, 2.34375}, {4.6875, 4.78516}, {7.42188, 7.51953},
{10.2539, 10.3516}, {13.2812, 13.3789}, {16.2109, 16.3086},
{19.3359, 19.4336}, {22.3633, 22.4609}, {25.4883, 25.5859},
{28.6133, 28.7109}, {31.6406, 31.7383}, {34.7656, 34.8633},
{37.8906, 37.9883}, {41.0156, 41.1133}, {44.1406, 44.2383},
{47.2656, 47.3633}]
You can refine the search for roots by choosing a smaller eps than 0.1,
or you can use FindRoot with these smaller intervals. Here we repeat
with an eps of 10^-6:
In[11]:=
With[{a = 10}, IntervalBisection[Cot[x] - x/a + a/(4*x), x,
Interval[{0, 50}], 10^-6, MaxRecursion -> 30]]
Out[11]=
Interval[{2.28445, 2.28445}, {4.76129, 4.76129}, {7.46368, 7.46368},
{10.3266, 10.3266}, {13.2862, 13.2862}, {16.3031, 16.3031},
{19.3552, 19.3552}, {22.4298, 22.4298}, {25.5197, 25.5197},
{28.6202, 28.6202}, {31.7285, 31.7285}, {34.8426, 34.8426},
{37.961, 37.961}, {41.0829, 41.0829}, {44.2075, 44.2075},
{47.3344, 47.3344}]
Let me repeat the advantage of IntervalBisection. All of the roots to
your equation between 0 and 50 are guaranteed to lie in one of the above
intervals. Another nice thing with IntervalBisection is that for
functions with a finite number of roots, your starting interval can be
Interval[{-Infinity,Infinity}]. The disadvantage, of course, is that
most special functions cannot accept Interval objects as input.
Carl Woll
Wolfram Research
- References:
- sorting list of roots af a transcendental function
- From: Dule <dule23@gmx.de>
- sorting list of roots af a transcendental function