[R] polyroot behaviour

Ben Bolker bbo|ker @end|ng |rom gm@||@com
Thu Oct 2 19:35:56 CEST 2025


   I haven't thought about this at all, but for what it's worth, sympy 
gives the same answer (minus the tiny imaginary part):

from sympy import nroots
from sympy.abc import x
g = x**11 + 1000*x**10 + 500 *x**9 + 1
nroots(g)[0]

-999.499749749687

   The documentation for 
https://docs.sympy.org/latest/guides/solving/find-roots-polynomial.html 
mentions that

nroots() can fail sometimes for polynomials that are numerically ill 
conditioned, for example Wilkinson’s polynomial. Using RootOf() and 
evalf() as described in Numerically Evaluate CRootOf Roots can avoid 
both ill-conditioning and returning spurious complex parts because it 
uses a more exact, but much slower, numerical algorithm based on 
isolating intervals.


   FWIW the slow/more exact method described here still gives the large 
root.

from sympy import solve
g_solved = solve(g, x, dict=True);
for root in g_solved:
     print(root[x].n(10))

   Given the convergence of different methods, this is very unlikely to 
be a bug in R or the underlying algorithm.  Either there's a thinko and 
-999.499... is actually a root, or this is a badly conditioned problem 
for which it's extremely hard to get accurate numerical solutions ...


On 2025-10-02 12:14 p.m., tgs77m--- via R-help wrote:
> Colleagues,
> 
> g <- function(x) ( x^11 + 1000*x^10 + 500 *x^9 + 1 )
> coeffs <- c(1, rep(0, 8), 500, 1000, 1)
> roots <- polyroot(coeffs)
> 
> Output
> 
> [1]    0.25770068+3.958197e-01i
>   [2]   -0.34615184+3.782848e-01i
>   [3]   -0.04089779-4.838134e-01i
>   [4]    0.44124314-1.517731e-01i
>   [5]   -0.04089779+4.838134e-01i
>   [6]   -0.56201931-1.282822e-01i
>   [7]   -0.34615184-3.782848e-01i
>   [8]    0.44124314+1.517731e-01i
>   [9]   -0.56201931+1.282822e-01i
> [10]    0.25770068-3.958197e-01i
> [11] -999.49974975+1.110223e-16i
> 
> [11] -999.49974975+1.110223e-16i  makes  no sense since f>0 for all x
> 
> Why does polyroot do this?
> 
> Thomas Subia
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

-- 
Dr. Benjamin Bolker
Professor, Mathematics & Statistics and Biology, McMaster University
Director, School of Computational Science and Engineering
 > E-mail is sent at my convenience; I don't expect replies outside of 
working hours.



More information about the R-help mailing list