MathGroup Archive 2002

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

Search the Archive

Re: Re: Bug in NSolve?

  • To: mathgroup at
  • Subject: [mg34002] Re: [mg33974] Re: Bug in NSolve?
  • From: Andrzej Kozlowski <andrzej at>
  • Date: Fri, 26 Apr 2002 03:27:24 -0400 (EDT)
  • Sender: owner-wri-mathgroup at

On Thursday, April 25, 2002, at 03:59  PM, Rodger Rosenbaum wrote:

> Andrzej Kozlowski suggests that when there is a root of multiplicity 
> greater than 1, we
> should not be surprised if Mathematica only reports one root.  In his 
> examples, we can
> determine the multiplicity by inspection; but suppose we had a 
> polynomial of relatively
> high order, say fifth degree, with, say, 2 distinct roots, and 1 of 
> multiplicity 3, e.g.:
> NSolve[x^5 - 15 x^4 + 74 x^3 - 142 x^2 + 117 x - 35,x,20]
> Mathematica gives:
>  {{ x--> 1.000000},{ x--> 1.000000},{ x--> 
> 5.00000000000000000},{x-->7.00000000000000000}}
> What am I to make of this?  Why didn't Mathematica form the Union of 
> the three identical
> roots and only show one?

First of all, as I wrote in my message, you have to look at the answer 
in InputForm (or FullForm):

NSolve[x^5-15 x^4+74 x^3-142 x^2+117 x-35,x,20]//InputForm

{{x -> 0.9999999999999999999`6.1651}, {x -> 1.`6.1651},
  {x -> 5.`18.1471}, {x -> 7.`18.3392}}

Usisng the given precision Mathematica sees four distinct roots. It did 
apply Union. Why it did not see that actually three roots (which are 
really 1's)  are equal? Of course it is because of the way it computes 
them. (A trivial illusttration. Suppose you have a quadratic whose two 
equal roots satisfy a + b== 2 , so they are both 1.   If Mathematica 
computes first a and makes an error of, say delta  and then finds b from 
b== 2-a than a and b may now be sufficiently far to be considered 

> Can I be sure that the root, 5, doesn't have multiplicity
> greater than one?  The lesser precision of the two roots, 1, implies 
> higher multiplicity
> than the roots, 5 and 7, but but can I rely on such an inference?  And 
> there is that claim
> in the Mathematica Book:
> "NSolve will always give you the complete set of numerical solutions to 
> any
> polynomial equation in one variable."

This is indeed the complete *set* of solutions, within this precision. 
Note the word set, in mathematics this normally means that multiplicity 
is not counted.

> And here is some further peculiar behavior; try:
> NSolve[x^3 - 3 x^2 + 3 x - 1,x,20]
> NSolve[x^4 - 4 x^3 + 6 x^2 - 4 x + 1,x,20]
> These give two roots of unity, but if you remove the third argument 
> (the 20), then they
> give 3 and 4 roots of unity, respectively. Make the third argument in 
> the cubic 25, and
> get three roots of unity; make the third argument 200 and get only two 
> roots.
> and
> NSolve[x^5 - 5 x^4 + 10 x^3 - 10 x^2 + 5 x - 1,x,20]
> This gives 4 roots of unity; make the third argument 25 and get only 3 
> roots.  Make the
> third argument 200, or 10000, and get two roots.

This is not "further peculiar behaviour". Read my explanation again.
One reason why NSolve behaves the way it does is that getting correct 
multiplicity in appraximate computations is tricky, particularly in the 
multivariate case. I have been told this behaviour will be changed in 
the future, but in any case, the answer you get will always only be 
correct to within the given precision. In other words, Mathematica will 
tell you that you have a double root when you in fact have two distinct 
rots very close together, or, when you have a double root it may tell 
you you have two distinct ones, unless you use sufficient precision.

  To get accurate multiplicity you must use Solve:

Solve[x^5-15 x^4+74 x^3-142 x^2+117 x-35\==0,x]//InputForm

{{x -> 1}, {x -> 1}, {x -> 1}, {x -> 5}, {x -> 7}}

Andrzej Kozlowski
Toyama International University

  • Prev by Date: Re: Pattern matching
  • Next by Date: Re: Re: Pattern matching
  • Previous by thread: Re: Bug in NSolve?
  • Next by thread: animations in mathematica