实现算法来计算R中的R
我试图在R中实现Brent-Salamin algorithm的变体。它在前25次迭代中运行良好,但后来出乎意料地返回负结果。实现算法来计算R中的R
算法我想要实现的是:
initial values: x_0 = 1; y_0 = 1/sqrt(2); z_0 = 1/2
x_n = (x_n-1 + y_n-1)/2
y_n = sqrt(x_n-1 * y_n-1)
z_n = z_n-1 - 2^n * (x_n^2-y_n^2)
p_n = (2 * x_n^2)/z_n
其中n是当前迭代。
一个更漂亮的格式化公式是here。
我想通了的代码是:
mypi <- function(n){ x = 1
y = 1/sqrt(2)
z = 1/2
iteration = 0
while(iteration < n){
iteration = iteration + 1
newx = (x + y)/2
y = sqrt(x * y)
x = newx
z = z-(2^iteration * (x^2 - y^2))
p = (2 * x^2)/z
}
return(p)
}
输出:
> mypi(10) [1] 3.141593
> mypi(20)
[1] 3.141593
> mypi(50)
[1] -33.34323
所以,我是新来的R,有没有在我的代码中的错误或者是它的算法?
回答:
你的代码只是因为它不符合wiki页面中写的算法而变得混乱起来。正确的版本是这样的:
mypi <- function(n){ x = 1
y = 1/sqrt(2)
z = 1/4
p <- 1
iteration = 0
while(iteration < n){
iteration = iteration + 1
newx = (x + y)/2
y = sqrt(x * y)
# x = newx
# z = z-(2^iteration * (x^2 - y^2))
z = z- p* (x-newx)^2
p = 2*p
x = newx
}
(newx + y)^2/(4*z)
}
给人
> mypi(10) [1] 3.141593
> mypi(20)
[1] 3.141593
> mypi(50)
[1] 3.141593
以上是 实现算法来计算R中的R 的全部内容, 来源链接: utcz.com/qa/266062.html