[R] newton.method

Prof. John C Nash nashjc at uottawa.ca
Fri Jul 30 18:54:17 CEST 2010


Sometimes it is easier to just write it. See below.

On 10-07-30 06:00 AM, r-help-request at r-project.org wrote:
> Date: Thu, 29 Jul 2010 11:15:05 -0700 (PDT)
> From: sammyny<sjain at caa.columbia.edu>
> To:r-help at r-project.org
> Subject: Re: [R] newton.method
> Message-ID:<1280427305687-2306895.post at n4.nabble.com>
> Content-Type: text/plain; charset=us-ascii
>
>
> newton.method is in package 'animation'.
>
> Thanks Ravi.
> BBSolve/BBOptim seems to work very well although I am not familiar with the
> optimization methods being used there. Is there a way to specify a tolerance
> in the function to get the required precision.
>
> I did something like this to use newton method.
> require(animation)
> newton.method(f, init=2, tol=10*exp(-8))
> But it gives bogus results.
>
> If someone could point me a correct working version of newton method for
> finding roots and its usage, that would be helpful.
>
> cheers,
>
> Sam
>


tfn<-function(x) {
  f = 2.5*exp(-0.5*(2*0.045 - x)) + 2.5*exp(-0.045) + 2.5*exp(-1.5*x) - 100
  return(f)
}
tgr<-function(x) {
  g = 0.5*2.5*exp(-0.5*(2*0.045 - x))  -1.5*2.5*exp(-1.5*x)
  return(g)
}
newt<-function(start, fun, grad) {
     x<-start
     newx<-x+100 # to avoid stopping
     while( 1 != 0) {
        f<-fun(x)
        g<-grad(x)
        newx<-x-f/g
        cat("x, newx, f, g:",x,' ',newx,' ',f,' ',g,"\n")
        if ((100+x) == (100+newx)) return(newx)
        tmp<-readline("continue?")
        x<-newx
     }
}

You can try

    newt(7,tfn, tgr)

    newt(-7,tfn,tgr)

and get both roots quite quickly.

However, I'd probably used uniroot by preference as a general tool. The scripts above are 
meant for learning purposes.

Best,

John Nash

PS. I did check tgr with numDeriv -- always worth doing.



More information about the R-help mailing list