2017-12-27 9 views
1

Brent-Salamin algorithmの変形をRに実装しようとしています。これは最初の25回の反復ではうまく動作しますが、予期しない動作をして、πを計算するためのアルゴリズムを実装する

私が実装するアルゴリズムは次のとおりです。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 

、私のコードにバグがあるか、それはアルゴリズムのですか?

+0

どこから来る 'i'ん与えますか? – AdamO

+0

@AdamOそれは 'iteration'ではなく、' i'であると仮定されています –

+1

あなたのコードを約20分間演奏した後、正確な答えはなく、説明以外おそらく浮動小数点演算の制限に起因します。私は負の数を見始める前に、ほぼ50回反復作業をするようにしました。何回も繰り返すと、 'z'の' 2^iteration'項が非常に大きくなり、 'x^2 - y^2'項が小さくなり、丸めなどが始まります。あなたが見る負の数は単なる人工物です。 –

答えて

11

あなたのコードは、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 
+0

いいえキャッチ...私はコード自体の精度を確認することは考えていないでしょう+1 –

+0

あなたの答えをありがとう。私の質問の最初の文章で書いたように、アルゴリズムのバリエーションを実装しようとしていましたが、その結果、その正確さについてはわかりませんでした。これは私の質問の最後に、Rコードにバグがあるか、問題がアルゴリズムそのものかどうかを尋ねた理由です。したがって、25回以上の反復でバリエーションが間違っていても、バリエーションの実装が正常であれば、これは私の質問に答えてくれてとても役に立ちます。だからあなたは「間違った」アルゴリズムの実装においても問題を見つけましたか? – amadeusamadeus

+0

@amadeusamadeusアルゴリズムをデバッグしたい場合は、math.stackexchange.comの方々がお手伝いできるはずです。私はあなたがこれをどのように導いたかを100%確信していません。それは$ \ pi $の分数を与えるアークタンジェントな値に対するHouseholderのアルゴリズムのようです。とにかく、あなたのアルゴリズムはきれいにフォーマットされた数式と一致するので、問題はありません。最後に考慮すべき点は、ほとんどのアルゴリズムは、実行した固定反復に基づいて終了するのではなく、値が目標精度に達したときに終了します。 50回の反復が浮動小数点精度の限界に達する可能性があります。 – AdamO

関連する問題