牛顿';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)
isTRUE
。对我来说,它迭代了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
vs4.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
}