【发布时间】:2013-10-30 13:18:27
【问题描述】:
所以,我应该编写代码来执行牛顿法,以指定精度(公差)计算任意数的平方根。
这是我的代码:
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]
}
eps 是公差。当我使用该函数计算 21 的平方根时,我得到了以下输出:
> MySqrt(21, eps = 1e-1, verbose = TRUE)
Iteration: 1 6.454545455
Iteration: 2 4.854033291
Iteration: 3 4.59016621
但是,我不确定该函数是否会停止执行迭代。有人可以验证我的代码是否正确吗?将不胜感激!
【问题讨论】:
-
你认为它为什么会提前停止?您要求的公差为十分之一...
all.equal(MySqrt(21, eps=1e-1), sqrt(21), tolerance=1e-1)是TRUE。 -
对我来说它迭代了 6 次,打印输出 5 次,它看起来与
sqrt(21)的 6 位数相同 -
> MySqrt(21, 0.01) 迭代:1 6.454545455 迭代:2 4.854033291 迭代:3 4.59016621 [1] 4.590166 是否应该进行第四次迭代?第 2 次和第 3 次迭代结果之间的差异不小于容差水平,因此仍应执行循环。但我不知道为什么它只在 3 次迭代时停止。
-
而不是
myvector[i],只需返回myvector,您就会看到全部内容。它实际上比它告诉你的迭代次数多 1 次。它停止了,因为myvector的最后两个元素的绝对差异小于.01的eps:4.590166vs4.582582 -
我的错。如果我们将详细设置为 TRUE,它只会显示到第 3 次迭代。第 4 次迭代仍然没有显示。
标签: r