2013-10-21 80 views
1

所以,我應該寫代碼來執行牛頓法來計算任意數的平方根到指定的精度(容差)。牛頓法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 { 
    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 

我不知道如果函數停止執行迭代時,它應該是,但是。有人可以驗證我的代碼是否正確?這將不勝感激!

+2

爲什麼你認爲它會停止提前?你要求的容差是十分之一......'all.equal(MySqrt(21,eps = 1e-1),sqrt(21),tolerance = 1e-1)'是'TRUE'。 – Justin

+0

對我來說迭代6次,打印輸出的5倍,和它看起來相同的出6位數字爲'的sqrt(21)' –

+0

> MySqrt(21,0.01) 迭代:1 6.454545455 迭代:2 4.854033291 迭代: 3 4.59016621 [1] 4.590166 是否應該有第四次迭代?第二次迭代結果和第三次迭代結果之間的差值不小於容差級別,因此仍應執行循環。但我不知道爲什麼它只停留在3次迭代。 – user2884679

回答

3

你的代碼幾乎是正確的。它正在迭代正確的次數。唯一的錯誤是你不會增加i直到break語句之後,所以你沒有返回最近的近似值。相反,你正在返回前一個。

爲了驗證它是否在正確的時間停止,可以將跟蹤線向上移動到中斷點上方。您還可以將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 
} 
+0

謝謝!在R編碼方面仍然是一個新手,所以我仍然倖免於Google的R風格指南,但你有很大的幫助! – user2884679