[英]Newton's Method in R Precision/Output
所以,我應該編寫代碼來執行牛頓方法來計算任意數字的平方根到指定的精度(公差)。
這是我的代碼:
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
但是,我不確定函數是否應該停止執行迭代。 有人可以驗證我的代碼是否正確嗎? 非常感謝!
你的代碼幾乎是正確的。 它正在迭代正確的次數。 唯一的錯誤是你在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風格編寫。 例如,除非您想要返回整個估算向量,否則您沒有理由需要將它們全部保留。 此外,不是使用while循環,而是使用for循環更有意義。 這是您的功能的一個可能的改進版本:
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.