在R中编写平方根函数

时间:2016-11-21 00:44:22

标签: r

我试图在R中写一个平方根函数。该函数应该像sqrt()一样,但当然不能使用该函数。我应该使用Newton的方法来计算平方根,这是:

y(a + 1)= [y(a)+ x / y(a)] / 2

这里x是我试图计算平方根的数字,而y(0)是x的平方根的初始猜测。

该函数应该包含四个参数:x(数字I&m;尝试计算平方根),eps(被认为相等的迭代之间的值差),iter(最大值)迭代次数)和详细(说我想输出中间结果)。

我的问题是我不太精通在R中编写函数。我有C ++的经验,但在R中它们略有不同。

我相信我应该写一些类似的东西。

要求用户输入一个数字作为我们想要计算平方根的值的猜测。使用两个if语句从1到iter进行for循环1)停止函数并在达到最大迭代次数时输出y值2)如果连续迭代之间的差异较小,则停止函数并输出y值比eps。

这是我到目前为止的代码:

MySqrt <- function (x, eps = 1e-6, iter = 100, verbose = TRUE) {
 for (i in 0:itmax) {
   y[0] <- readline(prompt="Please enter your initial square root      guess: ")
   y[i + 1] = (y[i] + x / y[i])/2
   if (i == 100) {
     stop (return(y[i + 1]))
   }
   if (abs(y[i + 1] - y[i]) < eps) {
     stop (return(y[i + 1]))
   }
}
return(y[i + 1])
}

这是输入初始平方根猜测后收到的错误:y [0]中的错误&lt; - readline(提示=&#34;请输入您的初始平方根猜测:&#34;):   对象&#39; y&#39;找不到

老实说,我并不期望代码能够正常运行,因为我确定有多个错误。

4 个答案:

答案 0 :(得分:1)

你应该使用iter而不是itmax。
我在函数中初始化了y,y的输入应该被格式化为数字而不是字符。您还可以使用|来简化if语句(要么)。
我还添加了“cat”函数,这样你就可以在函数打印出平方根值之前看到我是什么。

MySqrt <- function (x, eps = 1e-6, iter = 100, verbose = TRUE) {
  y = 0
  y[1] = as.numeric(readline(prompt="Please enter your initial square root      guess: "))
  for (i in 1:iter) {
    y[i+1] = as.numeric((y[i] + (x/y[i]))/2)
    if (i == 100 || abs(y[i+1] - y[i]) < eps) {
      cat("This is", i,"th try: \n")
      return(y[i+1])
    }
  }
}

答案 1 :(得分:0)

试试这个:

newton.raphson <- function(x, start, epsilon=0.0001, maxiter=100) {
  y <- c(start) # initial guess
  a <- 1        # number of iterations
  while (TRUE) {
    y <- c(y, (y[a] + x / y[a])/2)
    if (abs(y[a+1] - y[a]) < epsilon | a > maxiter) { # converged or exceeded maxiter
      return(y[a+1])
    }
    a <- a + 1
  }
}

newton.raphson(2, 0.5, 0.01)
# [1] 1.414234

newton.raphson(3, 0.5, 0.01)
# [1] 1.732051

答案 2 :(得分:0)

因为sqrt(n)&lt; n / 2然后精度为1/10000

sqrnt=function(y){
    x=y/2 
    while (abs(x*x-y) > 1e-10) 
    {x=(x+y/x)/2 }
    x
}

答案 3 :(得分:0)

以牛顿的方法。如果您想知道a的平方根,可以开始估算一个数字x(例如a/2),可以使用以下公式计算出更好的估算值:

y = (x + a / x) / 2

如果y != x,则设置x = y,然后重复进行直到y == x。然后,您得到a的平方根。请参见下面的代码:

square_root <- function(a) {
  x <- a/2
  while (TRUE) {
    y <- (x + a / x) / 2
    if (y == x) break
    x <- y
  } 
  return(y)
}