6

平方根の値を見つけるためのニュートン法 (反復を使用) のコードを実装しようとすると、問題が発生します。特定の精度に達したら値の出力を停止する機能を取得しようとしていますが、これを機能させることができないようです。以下は私のコードです。

MySqrt <- function (x, eps = 1e-6, itmax = 100, verbose = TRUE){
  i <- 1
  myvector <- integer(0)
  GUESS <- readline(prompt="Enter your guess: ")
  GUESS <- as.integer(GUESS)
  while(i <= itmax){
      GUESS <- (GUESS + (x/GUESS)) * 0.5
      myvector <- c(myvector, GUESS)
      if (abs(GUESS-x) < eps) break
      i <- i + 1
  }

  myvector

if 文が機能しないのはなぜですか?

4

2 に答える 2

3

アップデート:

@agstudy の回答に対する @RichieCotton のコメントをご覧ください。私は Richie に同意します。実際、@agstudy のアプローチを使用する方が理にかなっています。


元の答え:

あなたの関数は問題ありません、あなたの数学はオフです。
GUESSandxは (必然的に) 近くあるべきではありませんがGUESS * GUESSxそうあるべきです。

MySqrt <- function (x, eps = 1e-6, itmax = 100, verbose = TRUE){
  i <- 1
  myvector <- integer(0)
  GUESS <- readline(prompt="Enter your guess: ")
  GUESS <- as.integer(GUESS)
  while(i <= itmax){
      GUESS <- (GUESS + (x/GUESS)) * 0.5
      myvector <- c(myvector, GUESS)
      browser(expr={i == 10 || abs(GUESS-x) < eps})
      if (abs((GUESS*GUESS)-x) < eps) break    ###  <~~~~  SEE HERE
      i <- i + 1
  }

  myvector
}
于 2013-10-16T02:20:50.430 に答える
3

これはうまくいくはずです:

MySqrt <- function (x, eps = 1e-6, itmax = 100, verbose = TRUE){
  i <- 1
  myvector <- vector(mode='numeric',itmax)  ## better to allocate memory
  GUESS <- readline(prompt="Enter your guess: ")
  GUESS <- as.numeric(GUESS)
  myvector[i] <- GUESS
  while(i <= itmax){
    GUESS <- (GUESS + (x/GUESS)) * 0.5
    if (abs(GUESS-myvector[i]) < eps) break
    i <- i + 1
    myvector[i] <-  GUESS
  }
  myvector[seq(i)]
}

MySqrt(2)
Enter your guess: 1.4
[1] 1.400000 1.414286 1.414214
于 2013-10-16T02:21:19.740 に答える