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?
>
>
>
>
>