Re: roots
- To: mathgroup at smc.vnet.net
- Subject: [mg29646] Re: roots
- From: "Alan Mason" <amason2 at austin.rr.com>
- Date: Fri, 29 Jun 2001 01:36:25 -0400 (EDT)
- References: <9gevki$7k8$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Here is another way to accomplish what you want. Example of usage: ZerosAll[cos[x] + 0.05 x, x, -30, 30, 0.08], where mesh size = 0.08 here is arbitrary. Make changes to taste. The Zeros routine uses the so-called "Illinois algorithm" and works quite well. Code (uses procedural program style) follows: Zeros[expr_, var_,range_List, prec_: 16, eps_:10^-12] := Module[{x0, x1, y0, y1,xold, yold,x, y, h, f,func, ran = range}, i=0; f[arg_] := N[expr //. var->arg, prec]; x0 = ran[[1]]; x1 = ran[[2]]; y0 = f[x0]; y1 = f[x1]; If[y0 y1 > 0, Print["y0 is ", y0]; Print["y1 is ", y1]; Print["Try another initial range"]; Return[]]; While[Abs[x0-x1] > eps,i++; If[i > 69,Print["MaxIter = 70 Exceeded"]; Return[]]; If[y0 y1 <= 0, h = -y1 (x1-x0)/(y1-y0); xold = x0;x0=x1; yold = y0; y0=y1;x1+= h;y1=f[x1], While[y0 y1 > 0, i++; If[i > 69,Print["MaxIter = 70 Exceeded"]; Return[]]; yold=yold/2; h=-y1 (x1-xold)/(y1-yold); x0 = x1;x1+=h; y=f[x1]; y0=y1; y1=y]] ]; {N[x0, prec], N[y0, prec]}] ZerosAll[expr_, var_, lower_, upper_, mesh_, prec_:16, eps_:10^-12] := Module[{f, sgn=1, i,L={}, n = Floor[(upper-lower)/mesh]}, f[arg_] := N[expr //. var->arg, prec]; For[i=0, i< n, i++,sgn =Sign[f[lower + i* mesh] f[lower + (i+1)*mesh]]; If[sgn < 0, L = Append[L, Zeros[expr, var, {lower+i*mesh, lower+(i+1)*mesh}, prec, eps]]]; ]; Return[L]; ] roots = First[#]& /@ L; errors = Last[#]& /@ L; <maarten.vanderburgt at icos.be> wrote in message news:9gevki$7k8$1 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[83]:= FindRoot[0.05 x +Cos[x] == 0,{x,0}] > > Out[83]= {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. > > thanks for your help > > Maarten van der Burgt > Leuven > > > > >