       RE: roots

• To: mathgroup at smc.vnet.net
• Subject: [mg29403] RE: [mg29380] roots
• From: "David Park" <djmp at earthlink.net>
• Date: Sat, 16 Jun 2001 22:43:51 -0400 (EDT)
• Sender: owner-wri-mathgroup at wolfram.com

```Maarten,

In a problem like this, FindRoot needs some help.

f[x_] := 0.05x + Cos[x]

Look for the turning points in the function.

f'[x]
0.05 - Sin[x]

The turning points will occur at ArcSin[0.05] +/- 2n Pi and
(Pi-ArcSin[0.05])+/- 2n Pi. This generates the turning points over a
somewhat wider range than we need.

tpts = Sort[Flatten[Table[{ArcSin[0.05] + 2*Pi*n,
Pi - ArcSin[0.05] + 2*Pi*n}, {n, -4, 3}]]];

Between successive turning points we have monotonic functions. If we use the
turning points as limits and start at the midpoint, FindRoot just might get
the root. The following generates the second argument for FindRoot using
this approach.

Partition[tpts, 2, 1]
rootspecs = {x, Plus @@ #/2, First[#], Last[#]} & /@ %

This is the second item on a list of 15 generated rootspecs.

{x, -20.4204, -22.0412, -18.7995}

I then Map FindRoot onto this list of rootspecs. I used the Check command to
weed out cases where FindRoot went outside the specified domain. You obtain
error messages for those cases but no returned value.

rootsols = Check[FindRoot[f[x], #], Unevaluated[Sequence[]]] & /@ rootspecs

{{x -> -19.14330451998876}, {x -> -18.453754054424195},
{x -> -13.402772345741981},
{x -> -11.615238480230595},
{x -> -7.471140913774326}, {x -> -4.963166669457849},
{x -> -1.4959299134300144},
{x -> 1.6535692756905693}, {x -> 4.486156653004949},
{x -> 8.280873579694441}, {x -> 10.446026873732087},
{x -> 14.98402202417216}, {x -> 16.323959951197935}}

We could also have weeded our the domains with no roots by checking if f
evaluated at the turning points changed signs.

It would be nice if FindRoot had an option or mode such that it wouldn't
quit when it goes outside the specified domain, but used a bisection step
and resumed from the midpoint of the resulting domain. I think this would
generally be of value when we were dealing with monotonic functions in the
specified range.

David Park

> From: maarten.vanderburgt at icos.be [mailto:maarten.vanderburgt at icos.be]
To: mathgroup at smc.vnet.net
>
> hallo,
>
> What is the easiest solution to finding the 13 (real) roots of 0.05 x +
> Cos[x] == 0.
> I can be easily seen that there are 13 roots by plotting:
> Plot[{0.05 x,-Cos[x]},{x,-30,30}]
> but this is not sufficient for finding accurate numerical values.
>
> FindRoot only gives one value and it is hard to predict which
> root it will find with a specified start value:
>
> In:= FindRoot[0.05 x  +Cos[x] == 0,{x,0}]
>
> Out= {x -> -4.96317}
>
> There are three roots closer to 0 then x == -4.96317
>
> An NSolve only works for polynomials.
>
> Is there no simple way to find all roots of such an equation,
> eventually within a specified range.
>