簡體   English   中英

牛頓求根函數不適用於 R 中的 sqrt(x)

[英]Newton root finding function does not work with sqrt(x) in R

目前正在做一個基於尋根算法的家庭作業:

求根算法也可用於逼近某些函數。 以數學方式說明平方根函數 f(x) = √x 的評估如何表示為求根問題。4 使用牛頓法和二分法來近似 x 的不同值的 √x。 將您的近似值與 R 函數 sqrt 進行比較。 對於 x 的哪些值,近似值工作得很好? 牛頓法還是二分法性能更好? 這些問題的答案如何取決於您的起始值?

到目前為止,我有以下代碼適用於每個功能:

newton.function <- function(f, fPrime, nmax, eps, x0){
  n <- 1
  x1 <- x0
  result <- c()
  while((n <= nmax) && (abs(f(x1)) >= eps)){
    x1 <- (x0 - (f(x0)/fPrime(x0)))
    result <- c(result, x1)
    n <- n + 1
    x0 <- x1
  }
  iterations <- n - 1
  return(c(iterations, result[length(result)]))
}

平方函數:

g <- function(x){
  x^(1/2)
}

gPrime <- function(x){
  1/(2*x^(1/2))
}

當我執行該函數時,我要么在 if (abs(f(x1)) <= eps) break 中得到錯誤:缺少需要 TRUE/FALSE 的值,或者如果 x0 = 0 我得到 1 和 0 結果。

newton.function(f = g, fPrime = gPrime, nmax = 1000, eps = 1E-8, x0 = 0)

我的二分功能同樣糟糕,我無法回答這個問題。

從編程的角度來看,您的代碼按預期工作。

如果你從 0 開始,這是精確的解,你會得到 0,很好。

現在看看從任何其他數字開始時會發生什么:

x1 <- (x0 - (f(x0)/fPrime(x0))) = (x0 - (x0^(1/2)/(1/(2*x^(1/2)))))
= x0-2x0 = -x0

因此,如果您從一個正數開始,則在第一次迭代后x1將為負數,並且由於您詢問負數的平方根,因此對f(x1)的下一次調用將返回NaN

錯誤消息告訴您 R 無法將abs(f(x1)) >= eps評估為 TRUE 或 FALSE,實際上, abs(f(x1))返回 NaN 並且在這種情況下>=運算符也返回NaN 這正是錯誤消息告訴您的內容。

所以我建議你看一些數學資料來檢查你的算法,但 R 部分沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM