[英]Newton root finding function does not work with sqrt(x) in R
目前正在做一个基于寻根算法的家庭作业:
求根算法也可用于逼近某些函数。 以数学方式说明平方根函数 f(x) = √x 的评估如何表示为求根问题。4 使用牛顿法和二分法来近似 x 的不同值的 √x。 将您的近似值与 R 函数 sqrt 进行比较。 对于 x 的哪些值,近似值工作得很好? 牛顿法还是二分法性能更好? 这些问题的答案如何取决于您的起始值?
到目前为止,我有以下代码适用于每个功能:
newton.function <- function(f, fPrime, nmax, eps, x0){
n <- 1
x1 <- x0
result <- c()
while((n <= nmax) && (abs(f(x1)) >= eps)){
x1 <- (x0 - (f(x0)/fPrime(x0)))
result <- c(result, x1)
n <- n + 1
x0 <- x1
}
iterations <- n - 1
return(c(iterations, result[length(result)]))
}
平方函数:
g <- function(x){
x^(1/2)
}
gPrime <- function(x){
1/(2*x^(1/2))
}
当我执行该函数时,我要么在 if (abs(f(x1)) <= eps) break 中得到错误:缺少需要 TRUE/FALSE 的值,或者如果 x0 = 0 我得到 1 和 0 结果。
newton.function(f = g, fPrime = gPrime, nmax = 1000, eps = 1E-8, x0 = 0)
我的二分功能同样糟糕,我无法回答这个问题。
从编程的角度来看,您的代码按预期工作。
如果你从 0 开始,这是精确的解,你会得到 0,很好。
现在看看从任何其他数字开始时会发生什么:
x1 <- (x0 - (f(x0)/fPrime(x0))) = (x0 - (x0^(1/2)/(1/(2*x^(1/2)))))
= x0-2x0 = -x0
因此,如果您从一个正数开始,则在第一次迭代后x1
将为负数,并且由于您询问负数的平方根,因此对f(x1)
的下一次调用将返回NaN
。
错误消息告诉您 R 无法将abs(f(x1)) >= eps
评估为 TRUE 或 FALSE,实际上, abs(f(x1))
返回 NaN 并且在这种情况下>=
运算符也返回NaN
。 这正是错误消息告诉您的内容。
所以我建议你看一些数学资料来检查你的算法,但 R 部分没问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.