牛顿';R精度/输出中的s方法

牛顿';R精度/输出中的s方法,r,R,所以,我应该编写代码来执行牛顿的方法,计算任意数的平方根,达到指定的精度(公差) 这是我的密码: MySqrt <- function(x, eps = 1e-6, itmax = 100, verbose = TRUE) { GUESS <- 11 myvector <- integer(0) i <- 1 if (x < 0) { stop("Square root of negative value") } else {

所以,我应该编写代码来执行牛顿的方法,计算任意数的平方根,达到指定的精度(公差)

这是我的密码:

MySqrt <- function(x, eps = 1e-6, itmax = 100, verbose = TRUE) {
  GUESS <- 11
  myvector <- integer(0)
  i <- 1
  if (x < 0) {
    stop("Square root of negative value")
  }
  else {
    myvector[i] <- GUESS

    while (i <= itmax) {
      GUESS <- (GUESS + (x/GUESS)) * 0.5
      myvector[i+1] <- GUESS

      if (abs(GUESS-myvector[i]) < eps) {
        break()
      } 

      if (verbose) {
        cat("Iteration: ", formatC(i, width = 1), formatC(GUESS, digits = 10, width = 12),     "\n")
      }

      i <- i + 1

    }
  }    
  myvector[i]
}

但是,我不确定该函数是否在应该执行迭代时停止执行迭代。有人能验证我的代码是否正确吗?这将是非常感谢

您的代码几乎是正确的。它正在迭代正确的次数。唯一的错误是直到break语句之后才递增
i
,因此不会返回最近的近似值。而是返回上一个

为了验证它是否在正确的时间停止,可以将跟踪线向上移动到断点上方。您还可以将
GUESS myvector[i]
添加到跟踪中,以便在差异足够小时可以看到它停止。如果执行此操作并运行该函数,那么它在正确的时间停止以及返回错误值的事实将是显而易见的:

> MySqrt(21,eps=1e-1)
Iteration:  1 6.454545 -4.545455 
Iteration:  2 4.854033 -1.600512 
Iteration:  3 4.590166 -0.2638671 
Iteration:  4 4.582582 -0.007584239 
[1] 4.590166
虽然您的代码(几乎)是正确的,但它不是以非常好的R风格编写的。例如,除非您希望返回整个估计向量,否则没有理由需要将它们全部保留。此外,这里使用for循环比使用while循环更有意义。这里有一个可能的功能改进版本:

MySqrt <- function(x, eps = 1e-6, itmax = 100, verbose = TRUE) {
  GUESS <- 11
  if (x < 0) {
    stop("Square root of negative value")
  }
  for(i in 1:itmax){
      nextGUESS <- (GUESS + (x/GUESS)) * 0.5
      if (verbose)
        cat("Iteration: ", i, nextGUESS, nextGUESS-GUESS, "\n")

      if (abs(GUESS-nextGUESS) < eps) 
        break

      GUESS<- nextGUESS
    }
  nextGUESS
}

MySqrt为什么你认为它会提前停止?你要求的公差是十分之一……
all.equal(MySqrt(21,eps=1e-1),sqrt(21,tolerance=1e-1)
is
TRUE
。对我来说,它迭代了6次,打印了5次输出,看起来与
sqrt(21)
>MySqrt(21,0.01)迭代:16.4545455迭代:24.854033291迭代:34.5901621[1] 4.590166是否应该进行第四次迭代?第二次和第三次迭代结果之间的差异不小于公差水平,因此循环仍应执行。但我不知道为什么它仅在3次迭代时停止。而不是
myvector[I]
,只要返回
myvector
,你就会看到整个过程。它实际上比它告诉你的时间多迭代了1次。它停止了,因为
myvector
的最后两个元素的绝对差值小于
.01
eps
4.590166
vs
4.582582
我的坏。如果我们设置动词如果是真的,它最多只能显示第3次迭代。第4次迭代仍然没有显示。谢谢!仍然是R编码的新手,所以我仍然依靠谷歌的R风格指南生存,但是你帮了我很大的忙!
MySqrt <- function(x, eps = 1e-6, itmax = 100, verbose = TRUE) {
  GUESS <- 11
  if (x < 0) {
    stop("Square root of negative value")
  }
  for(i in 1:itmax){
      nextGUESS <- (GUESS + (x/GUESS)) * 0.5
      if (verbose)
        cat("Iteration: ", i, nextGUESS, nextGUESS-GUESS, "\n")

      if (abs(GUESS-nextGUESS) < eps) 
        break

      GUESS<- nextGUESS
    }
  nextGUESS
}