试图评估pi到7s.f.使用来自arctan(x)的泰勒级数近似的结果。在while循环中挣扎

时间:2017-11-22 15:52:41

标签: python python-3.x loops while-loop equation

我对Python完全陌生,并且在部分工作中遇到了一些麻烦。

首先,我们必须使用泰勒级数展开来定义一个近似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

这是我尝试评估pi到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位小数,但5d和6 dp的4dp和小时/天需要几分钟。我知道这是一个非常低效的方法,但是花了很长时间尝试不同的while循环等我无法使用TaylorExp函数找到更快的方法,所以任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:2)

您的代码正在花费O(n^2)时间,这是您第一次进行1次迭代,第二次进行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