Newton-Raphson Root Finding Algorithm

492 Views Asked by At

Summary of problem

My objective is to create a function called newton.raphson to implement the Newton-Raphson root-finding algorithm.

Root Finding Algorithm: x1 = X0 - f(xo)/f'(x0)

I have 2 arguments:

  1. iter = number of iteration (value = 10^5)
  2. epsilon = for the tolerance (value = 10^-10)

Can not depend on variables outside of the function

newton.raphson <- function(f, x0, iter=1e5, epsilon=1e-10) {
    x <- x0
    h <- 1e-5
    for (t in 1:iter) {
        drvt <- f((x+h)) - f((x-h)) / (2 * h)
        update <- x - f(x)/ drvt
        if (abs(update) < epsilon) {
            break
        }
        x <- update
    }
    root <- x
    return(root)
}
# Define some function to test
f <- function(x) {
    x^2 - 4 * x - 7
}

I get the following results:

> newton.raphson(f, 0)
[1] 2.000045
> newton.raphson(f, 3)
[1] 5.000024

But results should be:

-1.316625
5.316625
1

There are 1 best solutions below

0
On BEST ANSWER

Your derivative calculation is a little bit broken - you forgot parenthesis around the difference between f(x+h) and f(x-h):

drvt <- ( f(x+h) - f(x-h) ) / (2 * h)

Also, you should compare the difference between the old and new root approximation to the tolerance. In order to make things more clear, rename your misleading update variable to something like new.x. Then, your should check if (abs(new.x - x) < epsilon).