Brent-Salamin algorithm의 변형을 R에 구현하려고합니다. 처음 25 번의 반복에서는 잘 작동하지만 예기치 않게 작동하여 부정적인 결과를 반환합니다.R에서 파이를 계산하는 알고리즘 구현
제가 구현하려는 알고리즘은 다음과 같습니다
n은 현재 반복이다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
.
더 아름답게 서식이 지정된 수식은 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)
}
출력 : 내가 R에 새로운 오전 그래서으로
> mypi(10)
[1] 3.141593
> mypi(20)
[1] 3.141593
> mypi(50)
[1] -33.34323
, 내 코드에 버그가 있거나 알고리즘입니까?
경우'에서 오는 i' 않습니다 준다? – AdamO
@AdamO'iteration'이 아니라'i'가 아닌'iteration'으로되어 있습니다. –
약 20 분 동안 코드를 가지고 놀고 나면 정확한 대답이 없으며 설명 이외에 하나가 있는지 확실하지 않습니다. 부동 소수점 산술 연산의 한계 때문일 수 있습니다. 음수를보기 시작하기 전에 거의 50 번 반복 해 보았습니다. 나는 많은 반복을 한 후에'z'의'2^iteration' 용어가 너무 커지고'x^2 - y^2' 용어가 너무 작아 져서 반올림 등이 시작될 것이라고 생각합니다. 음수는 그냥 인공물입니다. –