Re: Emergent Help: NSolve Problems!

*To*: mathgroup at smc.vnet.net*Subject*: [mg39781] Re: [mg39753] Emergent Help: NSolve Problems!*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>*Date*: Fri, 7 Mar 2003 03:31:19 -0500 (EST)*Sender*: owner-wri-mathgroup at wolfram.com

Let me first explain how you should do this sort of thing, and then why you got your strange problem. Here is the natural way to solve your equation and verify solutions: In[1]:= temp[s_] = s^10 + 10*s^9 + 10*s^8 + 10*s^7 + 10*s^6 + 10*s^5 + 10*s^4 + 1; In[2]:= sols = NSolve[temp[s] == 0, s] Out[2]= {{s -> -8.999981180131652}, {s -> -1.0653891185497242}, {s -> -0.4688280614863414 - 0.8862391397094913*I}, {s -> -0.4688280614863414 + 0.8862391397094913*I}, {s -> -0.4096838961924677 - 0.46994830628745526*I}, {s -> -0.4096838961924677 + 0.46994830628745526*I}, {s -> 0.4010475038405945 - 0.3125967760434639*I}, {s -> 0.4010475038405945 + 0.3125967760434639*I}, {s -> 0.5101496031789036 - 0.8786933507160907*I}, {s -> 0.5101496031789036 + 0.8786933507160907*I}} In[3]:= Chop[temp[s] /. sols] Out[3]= {-9.5367431640625*^-7, 0, 0, 0, 0, 0, 0, 0, 0, 0} Chop is needed to get rid of tiny imaginary parts that NSolve often (quite correctly!) produces in such cases. As you see, substituting the first root returns a small number but not sufficiently close to 0 for Mathematica to represent it as such. The problem is that the graph of the function is nearly vertical in the neighbourhood of this root, so small changes in the value of s will cause big changes in the values of f[s]. If we use more precision we can get a more satisfactory answer: In[4]:= sols = NSolve[temp[s] == 0, s, WorkingPrecision -> 20] Out[4]= {{s -> -8.999981180131654099939548143087365`19.5562}, {s -> -1.065389118549724124278194976082666`19.3865}, {s -> -0.46882806148634128751612222287947`19.1653 - 0.886239139709491347132385425552478`19.4418*I}, {s -> -0.46882806148634128751612222287947`19.1653 + 0.886239139709491347132385425552478`19.4418*I}, {s -> -0.409683896192467719586437750959655`19.446 - 0.469948306287455317085959897085235`19.5056*I}, {s -> -0.409683896192467719586437750959655`19.446 + 0.469948306287455317085959897085235`19.5056*I}, {s -> 0.401047503840594510026502154382282`19.8771 - 0.312596776043463878012674759908029`19.7689*I}, {s -> 0.401047503840594510026502154382282`19.8771 + 0.312596776043463878012674759908029`19.7689*I}, {s -> 0.510149603178903609184929379060869`19.5456 - 0.878693350716090655852767849544973`19.7817*I}, {s -> 0.510149603178903609184929379060869`19.5456 + 0.878693350716090655852767849544973`19.7817*I}} In[5]:= Chop[temp[s] /. sols] Out[5]= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} Now what happened in your case? In StandardForm mathemaica displays (by default) only six digits while the rest are hidden. If you had displayed your answer in InputForm you woudl have seen the hidden digits. ALternatively, if you just copied and pasted your answer you also would have got the correct accuracy. Instead you must have just re-typed what you saw on the screen: a bad policy in the case of Mathematica. Because of the sharp slope at the solution point the difference in the value of the function between the root Mathematica actually computes and the root it displays in StandardForm is pretty significant: In[33]:= temp[-8.99998] Out[33]= -411.4729804992676 In[34]:= temp[-8.999981180131652] Out[34]= -9.5367431640625*^-7 Andrzej Kozlowski Yokohama, Japan http://www.mimuw.edu.pl/~akoz/ http://platon.c.u-tokyo.ac.jp/andrzej/ On Thursday, March 6, 2003, at 04:35 pm, Chengzhou Wang wrote: > Hi, guys > > I have some complicated polynomials, and I want to calculate its roots. > HOwever, when I use NSolve, it creates some problems. Say a simple > example: > > temp[s_]=s^10+10 s^9+ 10 s^8 +10 s^7 +10 s^6+ 10 s^5 +10 s^4 +1; > NSolve[temp[s]==0, s] > > It will give: > > Out[4]= {{s -> -8.99998}, {s -> -1.06539}, {s -> -0.468828 - 0.886239 > I}, > >> {s -> -0.468828 + 0.886239 I}, {s -> -0.409684 - 0.469948 I}, > >> {s -> -0.409684 + 0.469948 I}, {s -> 0.401048 - 0.312597 I}, > >> {s -> 0.401048 + 0.312597 I}, {s -> 0.51015 - 0.878693 I}, > >> {s -> 0.51015 + 0.878693 I}} > > But when I plug in the first number, which is "-8.99998", it should > give a > value close to zero. However, it gives: > > In[5]:= temp[-8.99998] > Out[5]= -411.473 > > The other roots seems OK. Does anyone know why? This is just a simple > example. I have some more complicated polynomials to deal with. > > Thanks in advance! > > PS: Please reply (cc) to my email. I did not subscribe my email to the > this email group! > > -- > Chengzhou > > > >