我对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函数找到更快的方法,所以任何帮助都将非常感激。
答案 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