2

まず、これが問題です。

数学定数 π (pi) は、値が約 3.1415928 の無理数です... π の正確な値は、次の無限和に等しくなります: π = 4/1 - 4/3 + 4/5 - 4/7 + 4 /9 - 4/11 + ... 最初の数項の合計を計算することで、π の適切な近似値を得ることができます。浮動小数点値の誤差をパラメーターとして受け取り、現在の合計と前の合計の差の絶対値が得られるまで、項ごとに上記の合計を計算することにより、誤差内で定数 π を近似する関数 approxPi() を記述します (項が 1 つ少ない) は誤差以下です。関数は、差がエラー未満であることを検出すると、新しい合計を返す必要があります。この関数は、math モジュールの関数や定数を使用しないでください。説明されているアルゴリズムを使用して π を近似することになっています。

何度も読んだのですが、問題が何を言っているのかまだ完全には理解できないので、誰かが問題が何を求めているのかを理解するのを手伝ってくれたら本当にありがたいです. 教科書を調べたところ、e の無限和を使用して e を近似する同様の問題が見つかりました: 1/0! + 1/1! + 1/2! + 1/3!+...

def approxE(error):
    import math
    'returns approximation of e within error'
    prev = 1 # approximation 0
    current = 2 # approximation 1
    i = 2 # index of next approximation
    while current-prev > error:
        #while difference between current and previous
        #approximation is too large
                            #current approximation
        prev = current      #becomes previous
                            #compute new approximation
        current = prev + 1/math.factorial(i) # based on index i
        i += 1              #index of next approximation
    return current

この後、プログラムをモデル化しようとしましたが、解決策に近づいているとは感じません。

def approxPi(error):
    'float ==> float, returns approximation of pi within error'
    #π = 4/1 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ...
    prev = 4 # 4/1 = 4 : approx 0
    current = 2.6666 # 4/1 - 4/3 = 2.6666 : approx 1
    i = 5 # index of next approx is 5
    while current-prev > error:
        prev = current
        current = prev +- 1/i
        i = i +- 2
    return current

成功したプログラムが返されるはずです

近似Pi(0.5) = 3.3396825396825403および近似Pi(0.05) = 3.1659792728432157

繰り返しますが、助けていただければ幸いです。これで何が間違っているのかを理解したいと思います。

4

3 に答える 3

3

そのシリーズを使用して pi を概算しようとしている場合は、いくつかの項を書き出すことから始めます。

π = 4/1 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ...
     0     1     2     3     4     5     ...

そして、級数の n 番目の項を返す関数を書きます。

def nth_term(n):
    return 4 / (2.0 * n + 1) * (-1) ** n

そこから、コードは非常に一般的です。

def approximate_pi(error):
    prev = nth_term(0)  # First term
    current = nth_term(0) + nth_term(1)  # First + second terms
    n = 2  # Starts at third term

    while abs(prev - current) > error:
        prev = current
        current += nth_term(n)
        n += 1

    return current

それは私のために働くようです:

>>> approximate_pi(0.000001)
    3.1415929035895926
于 2013-02-10T23:24:52.813 に答える
1

これが私がそれを行う方法です:

def approxPi(error):
    # pi = 4/1 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ...
    value = 0.0
    term = 1.0e6
    i = 1
    sign = 1
    while fabs(term) > error:
        term = sign/i
        value += term
        sign *= -1
        i += 2
    return 4.0*value

print approxPi(1.0e-5)
于 2013-02-10T23:45:56.800 に答える
1

いくつかの問題があります。

A)i = i +- 2あなたが思っていることをしません。それが何であるかわかりません。

正しいコードは次のようになります (方法はたくさんあります)。

if i < 0:
    i = -(i-2)
else:
    i = -(i+2)

同じことが次の場合にも当てはまります。

current = prev +- 1/i

そのはず:

current = prev + 4.0/i

に正確に格納されているものに応じて、または何かi。注意してください!4.0Python2では、将来から新しい部門をインポートしない限り、4.

個人的には、変数、除数と符号の絶対値が必要なため、反復ごとに次のようになります。

current = current + sign * 4 / d
d += 2
sign *= -1

それはずっといいです!

B) ループの最後で、エラーの絶対値をチェックする必要があります。

何かのようなもの:

while abs(current-prev) > error:

現在の値が目標値を飛び越えるため、値が 1 つ大きくなったり小さくなったりするため、1 つの誤差は正、1 つが負になります。

于 2013-02-10T23:22:09.993 に答える