Newton-Raphson 求根算法

Newton-Raphson Root Finding Algorithm

问题总结

我的 objective 是创建一个名为 newton.raphson 的函数来实现 Newton-Raphson 求根算法。

求根算法:x1 = X0 - f(xo)/f'(x0)

我有两个参数:

  1. iter = 迭代次数(值 = 10^5)
  2. epsilon = 公差(值 = 10^-10)

不能依赖函数外的变量

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
}

我得到以下结果:

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

但结果应该是:

-1.316625
5.316625

您的导数计算有点问题 - 您忘记了 f(x+h)f(x-h) 之间的差异括号:

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

此外,您应该比较新旧根近似值与公差的差异。为了使事情更清楚,将误导性的 update 变量重命名为 new.x 之类的名称。然后,你应该检查 if (abs(new.x - x) < epsilon).