1

estimatePi()インドの数学者 Srinivasa Ramanujan によって発見された式に基づいて、Pi の値を推定して返す関数を作成します。最後の項が 1e-15 よりも小さくなるまで、while ループを使用して合計の項を計算する必要があります。Pi を推定する式は以下のとおりです。 ラマヌジャムの推定によると

(すみません、画像がアップできません)

def estimatePi():
import math
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
k=0
final=0
pi=0
while pi<1e-15:
    a=factorial(4*k)
    b=(1103+26390*k)
    c=factorial(k)
    d=c**4
    e=396**(4*k)
    f=2*math.sqrt(2)/9801
    final+=(a*b*f)/(d*e)
    k+=1
    pi=1/final
return pi

そして、私の問題はこれです:予想される答えは= 3.14159265359でした私の答えは= 3.14159273001です

私は自分のせいを見つけることができませんでした:(.誰かが私のためにこれを手伝ってくれますか?

4

5 に答える 5

3

あなたのコードにはいくつかの間違いがあります。まず第一に、あなたのコードでは、変数 pi が final と等しい形状や形式ではないことを覚えておいてください。pi は明らかに 1e-15 より大きい数値であるため、反復しない while ループを計算しています。簡単に言えば、コードは k=0 で数式を計算しているだけで停止します。したがって、これを行う1つの可能な方法は次のとおりです。

    def estimatePi():
        import math
        def factorial(n):
            if n == 0:
                return 1
            else:
                return math.factorial(n)
        k=1  # we want it at k=1 not 0 since we already have k=0 as Final
        Final=0.31830987844  #this is the value at k=0, the first value
        while Final>1e-15:   """ Note that 1e-15 is the limiting value and we want all b values that are less than 1e-15. k=2 is the final k value where b has the last smaller number than 1e-15.""" 

            b=(2*math.sqrt(2)/9801)*(factorial(4*k)*(1103+26390*k))/((factorial(k)**4)*(396**(4*k)))

            Final=Final+b
            k=k+1
            return 1/Final
   print estimatePi()
#This gives you the number you are looking for ---3.14159265359.
于 2015-12-26T03:12:41.147 に答える
1

これが私のコードです。必要に応じて同じ結果を返します。

    import math
    def factorial(n): 
        if n == 0:
            return 1
        else:
            return n * factorial(n-1) 
    def estimatePi():
        f=2*math.sqrt(2)/9801
        k=0
        RHS = 0
        while True:
            num = factorial(4*k)*(1103+26390*k)
            den = (factorial(k))**4 * 396**(4*k)
            a = f*num/den
            RHS += a
            if a < 1e-15: break 
            k+=1
        return 1/RHS
于 2016-12-04T01:54:09.140 に答える
1

あなたの答えは正しいです。浮動小数点数は、特に小数点以下の桁数が多い場合に精度に問題があります。正確でない値を計算する場合。

回答から、小数点以下 5 桁の pi の値が正しく推定されていることがわかります。

于 2012-08-09T09:32:25.957 に答える
0
import math
def factorial(n):
if n == 0:
    return 1
else:
    return n * factorial(n-1)
def series_term(k):
a=factorial(4*k)
b=(1103+26390*k)
c=factorial(k)
d=c**4
e=396**(4*k)
return float(a*b)/(d*e)
def estimatePi():
k=0
final=0
while True:
    term = series_term(k)
    final += term
    if term < 1.0e-15:
        break
    else:
        k += 1
f=2*math.sqrt(2)/9801 
pi = 1.0/(final * f)
return pi
于 2012-08-10T03:47:01.067 に答える
0

あなたが抱えている問題はあなたのコードではなく、尋ねられている質問に対するあなたの理解です。問題は次のように述べています。

最後の項が 1e-15 よりも小さくなるまで、while ループを使用して合計の項を計算する必要があります。

変数を 1 に等しくし、while ループの条件を read に変更しwhile variable>=1e-15:ます。while ループで、変数を SUMMATION の LAST TERM に等しく設定します。これにより、より正確な値が得られるはずです。価値のあることとして、これは正しい値を生成しますが、pyschoolsそれでも私のコードを渡しませんでした。

于 2013-10-14T18:22:15.330 に答える