我试图在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;找不到
老实说,我并不期望代码能够正常运行,因为我确定有多个错误。
答案 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)
}