Newton-Raphson 求根算法
Newton-Raphson Root Finding Algorithm
问题总结
我的 objective 是创建一个名为 newton.raphson
的函数来实现 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
您的导数计算有点问题 - 您忘记了 f(x+h)
和 f(x-h)
之间的差异括号:
drvt <- ( f(x+h) - f(x-h) ) / (2 * h)
此外,您应该比较新旧根近似值与公差的差异。为了使事情更清楚,将误导性的 update
变量重命名为 new.x
之类的名称。然后,你应该检查 if (abs(new.x - x) < epsilon)
.
问题总结
我的 objective 是创建一个名为 newton.raphson
的函数来实现 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
您的导数计算有点问题 - 您忘记了 f(x+h)
和 f(x-h)
之间的差异括号:
drvt <- ( f(x+h) - f(x-h) ) / (2 * h)
此外,您应该比较新旧根近似值与公差的差异。为了使事情更清楚,将误导性的 update
变量重命名为 new.x
之类的名称。然后,你应该检查 if (abs(new.x - x) < epsilon)
.