繁体   English   中英

牛顿求根函数不适用于 R 中的 sqrt(x)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM