2017-10-18 9 views
-2

私はWallis製品をコーディングするように求められましたが、実際には複雑ではないと思われました。だから私はコードを作ったが、明らかに、それはWallis(1)のためだけに働くことができ、残りはできませんでした。誰か助けてくれますか?ありがとうございました!WallisのPythonコードで何が問題になっていますか?

def Wallis (n): 
    result = 1 
    for count in range(2, n+2, 2): 
     result = result * (count**2/((count-1)*(count+1))) 
    return result 

ウォリスの公式を計算する式

(2*2)/(3*5) * (4*4)/(5*7) * (6*6)/(7*9) and so on until ((n*2) ** 2)/ ((n-1)* (n+1)) 

出力

Wallis(1) = (2*2)/(3*5) = 0.267 
Wallis(2) = Wallis(1) * (4*4)/(5*7) = 0.122 
+0

申し訳ありませんが、私は本当に知りません。 (n * 2)*(3 * 5)*(4 * 4)/(5 * 7)*(6 * 6)/ * 2)/((n-1)*(n + 1)) –

+0

私はこのウェブサイトを少し新しくしています。 –

+0

'range(2、2 * n + 2、2)'でなければなりません。ところで、 'count * count'は' count ** 2'より速いです。 FWIW、私は '2 * Wallis(1000000)== 3.141591868192167'を得る –

答えて

0

他にも述べたように、range()を変更する必要があります。

については、N = 3、

for count in range(2, n+2, 2): 
    print(i) 

2 
4 

を印刷するだろうが、あなたにも6を必要としていました。

Pythonドキュメントが正のステップについて

class range(start, stop[, step]) 

を言うように、範囲Rの内容が式Rによって決定さを[I] = +ステップを開始* I I> = 0及びr [i] <停止。

意味stopは含まれません。ここで

stepあなたは

for count in range(2, 2*(n+1), 2): 

および指数の乗算よりも高価であるを使用することができ、2です。だから、

count*count 

count**2 

よりも優れているので、修正されたバージョンはWallisで返される値は、パイの唯一の半分の値であることを

def Wallis(n): 
    result=1 
    for count in range(2, 2*(n+1), 2): 
     result*=((count*count)/((count-1)*(count+1))) 
    return result 

注意である可能性があります。

したい場合は、

return result*2 

return文を修正することができます。

0

は、主にあなたの範囲のコマンドが間違っている:また

range(2, 2*n+2, 2) 

、あなたはを複雑に移動することができます公式、すなわち:

for count in range(1, n): 
    result = result * (4*count*count/((2*count-1)*(2*count+1))) 
0

あなたのコードの問題はcount(count**2/((count-1)*(count+1)))で、count**2は、以下のcount-1n-1と同じである必要がなく、むしろ、それは実際に(2*n)-1あるしかし(2*n)**2と同じであるので、あなたの式で2*nに等しいということです。 count+1についても同様です。 limitとして

def wallis(limit): 
    result = 1 
    for x in range(2, limit, 2): 
     result *= (x/(x - 1)) * (x/(x + 1)) 
    return result 

が高くなる、それは半分パイに近い収束する(私はhttps://www.wikiwand.com/en/Wallis_productにある別の式を使用しますが)

私はあなたを助ける必要があり、私自身のバージョンを作りました。

関連する問題