实现算法来计算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

回到顶部