问题摘要
我的目标是创建一个名为newton.raphson的函数来实现牛顿-拉斐逊寻根算法。
寻根算法: x1 = X0 - f(xo)/f'(x0)
我有两个论点:
iter =迭代次数(值= 10^5)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发布于 2020-04-19 19:47:52
你的导数计算有点不正确--你忘记了f(x+h)和f(x-h)之间的差异。
drvt <- ( f(x+h) - f(x-h) ) / (2 * h)此外,您应该比较新旧根近似与公差之间的差异。为了使事情更清楚,将误导的update变量重命名为类似于new.x的变量。然后,您应该检查if (abs(new.x - x) < epsilon)。
https://stackoverflow.com/questions/61310003
复制相似问题