On 26/05/2008, at 10:38 AM, Hans W. Borchers wrote:

Rolf Turner <r.turner <at> auckland.ac.nz> writes:


      [...]

        However uniroot(p,c(1.995,2.005)) gives

        $root
        [1] 1.999993

        $f.root
        [1] -4.570875e+24

        Whoops!  I read that e+24 as e-24, so scrub all that I said.
        (You'd think, that having seen Bill Venables make a similar
         error --- which he corrected in the follow-up posting to which
         I was replying --- I would've been more careful.  Well, you'd
         think wrong.  Actually it *was* e-24 when I posted; then the
         Gremlins got in and changed everything. :-) )

        $iter
        [1] 4

        $estim.prec
        [1] 6.103516e-05

        What a difference 7.214144e-06 makes!  When you're dealing with
polynomials of degree 100.


I don't think R is the right tool to solve this kind of questions that belong to the realm of Computer Algebra Systems. Yacas is much to weak for such high-order polybomials, but we can apply more powerful CASystems, for instance the free
Maxima system. Applying

(%i)    nroots(x^100 - 2*x^99 + 10*x^50 + 6*x - 4000, minf, inf)

immediately shows that there are only *two* real solutions, and then

(%i)    a: realroots(x^100 - 2*x^99 + 10*x^50 + 6*x - 4000, 1e-15);
(%i)    float(a)

(%o)    [x=-1.074126672042147,x=1.999999999999982]

will provide real solutions with 15 decimals (does not change when more decimals
are used). So the difference that counts is actually much smaller.

The complex roots -- if needed -- will require special treatment.

I believe it would be fair to point such questions to Computer Algebra mailing lists and not try to give the appearance they could be solved satisfyingly with R. The same as a complicated statistics question in a Matlab or Mathematica
mailing list should be pointed to R-help.


        Be that as it were, it doesn't look like Maxima is doing so wonderfully
        either. Consider:

         > library(PolynomF)
         > x <- polynom()
         > p <- x^100-2*x^99+10*x^50+6*x-4000
         > a <- 1.999999999999982
         > p(a)
        [1] -1.407375e+14

        And notice the + sign in the exponent. :-)

        I tried doing

        > uniroot(p,c(1.9995,2.0005),tol=.Machine$double.eps)

        and got

        $root
        [1] 2

        $f.root
        [1] 912

        $iter
        [1] 5

        $estim.prec
        [1] 8.881784e-16

Well, 912 is a lot closer to 0 than -4.570875e+24, or even -1.407375e +14.
        But it still ain't 0.  Also that ``2'' of course isn't really 2.
        
        I set r <- uniroot(p,c(1.9995,2.0005),tol=.Machine$double.eps)$root
        I get p(r) = 912.

        But print(r,digits=22) gives  1.999999999999982.
        And print(a,digits=22) gives the identical result.
        Although p(r) and p(a) are wildly different.

        I guess it's possible that p(a) --- where ``a'' is as it appears,
        written out to 14 decimal places --- really is quite close to zero,
        and that -1.407375e+14 is due to round-off error in the calculation
        process.  But it's also possible that p(a) really is pretty close to
-1.407375e+14, i.e. Maxima isn't really finding the correct root either.
        Or something in between.

        I guess that to get a really ``correct'' answer, and check it properly,
you need a system that will do ``arbitrary precision arithmetic''. Which isn't R. I don't know if Maxima was using arbitrary precision arithmetic
        in the calculations shown.

Anyhow, I think the real point is that solving 100-th degree polynomials is a pretty silly thing to do, whatever package or system or language you use.
        That is, R may be the wrong tool for the job, but it's the wrong job.

And if you *must* do it, then you should do some careful checking and investigation of the results --- again irrespective of whatever package or system or language
        you use.

                cheers,

                        Rolf Turner


######################################################################
Attention:\ This e-mail message is privileged and confid...{{dropped:9}}

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to