2017-11-22 1 views
1

私はPythonを初めて勉強していて、私の仕事の一部で少し問題があります。πを7s.f​​に評価しようとしています。 arctan(x)からのTaylor系列近似の結果を使用します。 whileループで苦労している

まず、テイラー級数展開を使ってarctan(x)を近似する関数を定義しなければなりませんでした。

ここで、関数arctan(1)= pi/4を使ってpiを7sfに評価し、このレベルの精度に必要な反復回数Nを求めなければなりません。ここで

は私のテイラー展開のための私のコードは、(条件文が割り当ての別の部分のためにそこにある)である:

import math as mt 


def TaylorExp (x,N): 
    if abs(x) <=1: 
      n=0.0 
      total = 0.0 
      while (n<N): #performs N iterations. 
       c = (((-1)**n)/((2*n)+1))*(x**((2*n)+1)) 
       total += c 
       n += 1  
      return total 

、ここでは7sfにパイを評価し、必要なNを見つけることを試みるために私のコードです:

i=0 
z = 0 
k=0 
while ((format(k,'.6f'))!= (format(mt.pi,'.6f'))): 
    z = TaylorExp(1,i) 
    i += 1 
    k= z*4 
print ('The value for pi found from arctan (1) is', format(k,'.6f'),' which is accurate to 7sf.') 
print ('The number of iterations N required is: ',i, format(mt.pi, '.6f')) 

それには、最大3つの小数点以下の桁数のためにすぐに動作しますが、5および6 DPのための4DPおよび時間/日分かかります。私はこれが非常に非効率的な方法だと理解していますが、かなり長い間、ループなどで試していました。私はTaylorExp関数を使ってより高速なメソッドを見つけることができず、どんな助けにも大いに感謝します。

+0

それは何とかしないと意味がありません長い間あなたのコードを細かい部分に分割して、遅延がどこから来ているかを調べます。 –

+0

小数点以下5桁の場合は、1,000,000回の繰り返しで1秒かかりますが、非常に遅く収束しているようです。 –

答えて

2

コードはO(n^2)で、初回は1回、2回目は2回などとなります。

あなたが代わりに順に直列のすべてのステップを生成するジェネレータ、返すために、あなたのTaylorExp機能を変更することができます:

def TaylorExp(x): 
    total = 0.0 
    n = 0.0 
    while True: 
     c = (((-1)**n)/((2*n)+1))*(x**((2*n)+1)) 
     n += 1 
     total += c 
     yield total 

をし、このようにそれを使用します。私のコンピュータで

i = 0 
k = 0.0 

for z in TaylorExp(1): 
    k = z * 4 
    if format(k, '.6f') == format(math.pi, '.6f'): 
     break 
    i += 1 

print ('The value for pi found from arctan (1) is', format(k, '.6f'),' which is accurate to 7sf.') 
print ('The number of iterations N required is: ', i, format(math.pi, '.6f')) 

このコードは約5秒かかり、次のように表示されます。

The value for pi found from arctan (1) is 3.141593 which is accurate to 7sf. 
The number of iterations N required is: 1181460 3.141593 
+0

ファンタスティック、本当に助けと説明のおかげで - 私は完全に理解しています。 – Alex

関連する問題