MathGroup Archive 2002

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

Search the Archive

Re: Bug in NSolve?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg33820] Re: [mg33788] Bug in NSolve?
  • From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
  • Date: Fri, 19 Apr 2002 02:27:40 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

Unlike Solve, NSolve  returns only one root when it finds multiple roots 
it considers to be sufficiently close to be identical. In fact it seems 
that it applies Union to the final result. So when you use more 
precision the roots which were considered as distinct due to possible 
error become identified and appear only once. Here are some examples, 
which I think make it clear:

In[1]:=
NSolve[x^2-2x+1==0,x]

Out[1]=
{{x -> 0.9999999999999998}, {x -> 1.0000000000000002}}

Note that the roots are considered as distinct.
However,

In[2]:=
NSolve[(x - 1)*(x - 1) == 0, x]

Out[2]=
{{x -> 1.}}

Now you see only one root. Actually of course Mathematica found two, but 
it realized that they are equal. If you use the unfactored form of input 
but increase precision this is what happens. With working precision <= 
20 we get:

In[3]:=
NSolve[x^2 - 2*x + 1 == 0, x, 23]

Out[3]=
{{x -> 0.9999999999999997779553937032`11.0773},
   {x -> 1.0000000000000000035245156918`11.0773}}

but

In[4]:=
NSolve[x^2 - 2*x + 1 == 0, x, 24]

Out[4]=
{{x -> 1.`11.5778}}

The same thing happens in your case. Just look at your outputs using 
InputForm to see the hidden digits.

Why do Solve and NSolve behave differently here? Well, it seems to me 
that it is probably a matter of "philosophy". Solve is basically an 
"algebraic function" and from the algebraic point of view the 
multiplicity of roots is an important property of a solution. But most 
people looking for numerical solutions would be I think inclined to 
consider multiple roots as "the same". There may be also a more subtle 
or a much simpler explanation but I guess that has to come from someone 
intimately involved in the design of these functions.

Andrzej Kozlowski
Toyama International University
JAPAN
http://platon.c.u-tokyo.ac.jp/andrzej/



On Tuesday, April 16, 2002, at 04:50  PM, 
rodgerroSPAMNOT.siteconnect.com at library2.airnews.net wrote:

> The Mathematica book says in section 2.9.5:
>
> "NSolve will always give you the complete set of numerical solutions to 
> any
> polynomial equation in one variable."
>
> However,  Mathematica version 4.1.2  on a Pentium III gives this result:
>
> NSolve[4877361379 x^2 -9754525226 x + 4877163849==0,x,20]
>
> {{ x---> 0.9999797501 }}
>
> On the other hand,
>
> NSolve[4877361379 x^2 -9754525226 x + 4877163849==0,x,10]
>
> gives:
>
> {{ x ---> 0.99998 } , { x---> 0.99998 } }
>
> Machine precision works, but arbitrary precision doesn't?
>
> At least now we get two roots; the correct solution is given by:
>
> N[Solve[4877361379 x^2 -9754525226 x + 4877163849==0,x ] ,10]
>
> which is:
>
> {{ x ---> 0.99998 - 2.89955 x 10^-10 i },{ x---> 0.99998 + 2.89955 x 
> 10^-10i }}
>
> Does anybody know what's going on here?
>
>
>
>
>



  • Prev by Date: Re: Bug in NSolve?
  • Next by Date: Re: Passing arguments and pattern matching
  • Previous by thread: Re: Bug in NSolve?
  • Next by thread: Re: Bug in NSolve?