MathGroup Archive 2001

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

Search the Archive

Re: Re: roots

  • To: mathgroup at smc.vnet.net
  • Subject: [mg29544] Re: [mg29532] Re: roots
  • From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
  • Date: Sun, 24 Jun 2001 02:00:58 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

In fact the extra root of poly lies outside the range -20<x<20:

In[2]:=
 <<Algebra`RootIsolation`

In[3]:=
CountRoots[poly, {x, -20,20}]//Timing

Out[3]=
{4.98333 Second,13}

The roots can also be found by using InequalitySolve, though this seems to
take longer than your method:

In[5]:=
Timing[N[InequalitySolve[poly == 0 && -20 < x < 20, x]]]

Out[5]=
{68.8833 Second, x == -19.1433 || x == -18.4538 ||
 
   x == -13.4028 || x == -11.6152 || x == -7.47114 ||
 
   x == -4.96317 || x == -1.49593 || x == 1.65357 ||
 
   x == 4.48616 || x == 8.28087 || x == 10.446 ||
 
   x == 14.984 || x == 16.324}

Of course one would still need to verify that they do approximate the roots
of the original equation.
-- 
Andrzej Kozlowski
Toyama International University
JAPAN

http://platon.c.u-tokyo.ac.jp/andrzej/
http://sigma.tuins.ac.jp/~andrzej/



on 6/23/01 2:47 PM, Adam Strzebonski at adams at wolfram.com wrote:

> One can get approximations of the roots by approximating
> Cos[x] with initial terms of its Taylor series (we don't
> get a proof that there are only 13 solutions, but we get
> 13 good approximations of solutions).
> 
> In[1]:= poly=x/20+Normal[Series[Cos[x], {x, 0, 100}]];
> 
> We need to find approximations of real roots of poly.
> I don't want to use NSolve here, because it tries to find
> all complex roots. For high degree polynomials, if the number
> of real roots is much smaller than the degree, it is faster
> to isolate the real roots using exact methods than to find
> all the complex roots numerically.
> 
> We count the real roots first, so that we don't create any
> nonreal Root objects: the exact isolation of nonreal roots
> is slow. 
> 
> In[2]:= <<Algebra`RootIsolation`
> 
> In[3]:= CountRoots[poly, {x, -Infinity, Infinity}]//Timing
> Out[3]= {4.58 Second, 14}
> 
> The default root isolation method is based on computing numerical
> approximations of all complex roots, so we need to change it.
> 
> In[4]:= SetOptions[Root, ExactRootIsolation->True];
> 
> Now we compute the real roots of poly,
> 
> In[5]:= rts=Table[Root[poly, i], {i, 14}];//Timing
> Out[5]= {2.55 Second, Null}
> 
> find their numerical approximations,
> 
> In[6]:= nrs=N[rts, 25];//Timing
> Out[6]= {4.09 Second, Null}
> 
> and check which of them satisfy the equation x/20+Cos[x]==0
> 
> In[7]:= #/20+Cos[#]&/@nrs
> 
> -24       -24       -24
> -24
> Out[7]= {-1.65832863853270619235960, 0. 10   , 0. 10   , 0. 10   , 0.
> 10   ,
> 
> -24       -24       -25       -25       -24       -24
> -24
>> 0. 10   , 0. 10   , 0. 10   , 0. 10   , 0. 10   , 0. 10   , 0. 10   ,
> 
> -24       -24
>> 0. 10   , 0. 10   }
> 
> Here are the 13 roots of x/20+Cos[x]==0
> 
> In[8]:= Drop[nrs, 1]//InputForm
> 
> Out[8]//InputForm=
> {-19.14330451806538667880986570564361032264`25,
> -18.45375405471092374532000068940118616129`25,
> -13.40277147194542547333729073937332385855`25,
> -11.61523861449023313015711996574049279572`25,
> -7.47114091373322226214343658073674762609`25,
> -4.96316768881794772985279294265779822657`25,
> -1.49592991327175815500746007291204533048`25,
> 1.65356927612222660064136483786947282365`25,
> 4.48615628721076275861724952418303472826`25,
> 8.28087358013665167538895805572450457893`25,
> 10.44602686367261821801301652620945695607`25,
> 14.98402202436415195182719178207711523666`25,
> 
> 16.32395994938114931284258124546947389267`25}
> 
> 
> Best Regards,
> 
> Adam Strzebonski
> Wolfram Research
> 
> 
> Andrzej Kozlowski wrote:
>> 
>> It seems to me that the easiest way is this. First of all, we know that the
>> roots will all be between -20<x<20 (since Abs[Cos[x]]<1). So start with
>> In[5]:=
>> Plot[0.05 x +Cos[x],{x,-20,20}]
>> 
>> You will see all 13-teen roots. Now click on the graphic to select it.
>> Holding the Command key down on the Mac (I guess the Control key under
>> Windows?) click on the individual points where the curve intersects the x
>> axis and Copy. Paste the result into the FindRoot command (removing the
>> y-value) as below. You will get pretty good approximations to all the roots.
>> Here are just the first four values obtained in this way:
>> 
>> In[7]:=
>> FindRoot[0.05*x + Cos[x] == 0, {x, -18.8966}]
>> Out[7]=
>> {x -> -19.1433}
>> In[8]:=
>> FindRoot[0.05*x + Cos[x] == 0, {x, {-18.394}}]
>> Out[8]=
>> {x -> -18.4538}
>> In[9]:=
>> FindRoot[0.05*x + Cos[x] == 0, {x, -13.4688}]
>> Out[9]=
>> {x -> -13.4028}
>> In[10]:=
>> FindRoot[0.05*x + Cos[x] == 0, {x, -11.6596}]
>> Out[10]=
>> {x -> -11.6152}
>> 
>> --
>> Andrzej Kozlowski
>> Toyama International University
>> JAPAN
>> 
>> http://platon.c.u-tokyo.ac.jp/andrzej/
>> http://sigma.tuins.ac.jp/~andrzej/
>> 
>> on 01.6.16 3:47 PM, maarten.vanderburgt at icos.be at
>> maarten.vanderburgt at icos.be wrote:
>> 
>>> 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
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
> 
> 



  • Prev by Date: Re: Mathematica and Powerpoint
  • Next by Date: Re: Re: Originality
  • Previous by thread: Re: roots
  • Next by thread: Re: roots