0
pi/2 = 1 + 1/3 + (1*2) / (3*5) + (1*2*3) / (3*5*7) + ...

よし、もう一度やってみよう。

最大誤差を pi の値のパラメーターとして取り、計算された pi の値と、そのポイントに到達するために必要な反復回数を返す関数を作成する必要があります。再帰アルゴリズムを使用できません。

これまでのところ、私は持っています:

def piEuler (x):
    count = 0.0
    approx = 0.0
    approx2 = 1.0
    error = math.pi/2 - approx2
    while error > x:
        count = count + 1
        approx3 = approx + approx2
        error = math.pi/2 - approx3
        #print error
        approx = approx + approx2
        approx2 = approx2 * count/(count + 2)
        #print approx2
    final = math.pi - error
    return final, count

問題は、プログラムが負の値を返すことです。エラーはゼロに収束するはずです。シリーズから近似値を取得するには、許容される pi の値から誤差を差し引くことができる必要があります。私は何を間違っていますか?

4

3 に答える 3

2

This works:

import math

def piEuler(x):

    halfpi    = math.pi / 2.0
    count     = 0
    approx    = 1.0
    divisor   = 1
    numerator = 1
    while True:
        count     += 1
        numerator *= count
        divisor   *= 2*count + 1
        approx    += float(numerator) / float(divisor)
        error      = halfpi - approx

        if error < x:
            return (math.pi - error), count

The basic differences are:

  1. By switching the terminating condition of the loop to a test/break, I can remove the manual calculation of the second term of the series
  2. Careful use of int and float datatypes (this may have been your problem)
  3. Better naming of the variables leads to easier debugging
于 2013-02-22T03:54:21.550 に答える
1

アルゴリズムの実装が間違っていたようです。を行うのではなくpi/2 = 1 + 1/3 + (1*2)/(3*5) + (1*2*3)/(3*5*7) + ...、コードが行っているように見えますpi/2 = 1 + 1/3 + (1*2)/(3*4) + (1*2*3)/(3*4*5) + ...

分母が小さくなるため、合計をさらに大きくすることになり、間違いなくオーバーシュートが発生し、結果として負のエラーが発生します。

問題は次の行にあります。

approx2 = approx2 * count/(count + 2)

ご覧のとおり、 が偶数の場合countは偶数にcount + 2なります。簡単な修正は、これを次のように変更することです。

approx2 = approx2 * count/(2 * count + 1)

動作するアルゴリズムの例を次に示しますが、絶対誤差ではなく用語間の相対誤差を使用します (すべてを公開したくないでしょう;)):

from __future__ import division

def half_pi(max_err=10**-6, max_iter=10000):
    partial_sum = cur_term = 1
    n = 1
    while abs(t) > max_err and n < max_iter:
        cur_term = cur_term * (n / (2 * n + 1))
        partial_sum += cur_term
        n += 1
    return partial_sum, n
于 2013-02-22T04:06:31.583 に答える
0

シーケンス内の最小項 (コード内のapprox2 ) が error より大きくなるようにルーチンを書き直す必要があります。

また、最後のエラー計算に「math.pi」があります。math.pi/2 である必要がありますか?

エラーの性質も振動しているようです!

于 2013-02-22T04:03:09.647 に答える