在我学习数学的时候,我读到了关于名为Leibniz series for Pi的系列文章:
所以我为它做了一个程序,用这个系列的数字来表示:
def leibniz(n):
pi = 0
for i in range(1,n+1):
if(i % 2 == 0):
pi -= 1 / (2*i - 1)
else:
pi += 1/(2*i - 1)
pi = 4 * pi
return pi这段代码可以工作,但问题是它非常缓慢地收敛到Pi。
编辑:
我了解了Shanks变换并编写了程序
def accelrate(n,depth):
if depth == 1:
a = lebniez(n + 1)
b = lebniez(n)
c = lebniez(n-1)
return (a*c - b*b)/(a + c - 2*b)
a = accelrate(n + 1,depth - 1)
b = accelrate(n,depth - 1)
c = accelrate(n-1,depth - 1)
return (a*c - b*b)/(a + c - 2*b)所以htis所做的就是递归地应用Shanks变换并继续加速这个级数。但现在的问题是,由于递归,它是非常缓慢和准确性不提高,如果你增加深度。
这就是Shanks变换的低效吗?
发布于 2020-08-01 14:04:12
因此,经过周密的思考,我在我的小腿变换中想到了Cache减缩。
它并不是很重要,但仍然是一个很好的改进。
下面是:
import functools as ft
@ft.lru_cache(maxsize=32)
def lebniez(n):
pi = 0
n = n + 1
for i in range(1,n):
if(i % 2 == 1):
pi -= 1 / (2*i - 1)
else:
pi += 1/(2*i - 1)
pi = abs(4 * pi)
return pi
@ft.lru_cache(maxsize=128)
def accelrate(n,depth):
if depth == 1:
a = lebniez(n + 1)
b = lebniez(n)
c = lebniez(n-1)
else:
a = accelrate(n + 1,depth - 1)
b = accelrate(n,depth - 1)
c = accelrate(n-1,depth - 1)
return (a*c - b*b)/(a + c - 2*b)所以这个基本的帮助使它更稳定。
其次,关于效率不高的问题,原因是Shanks变换就是这样的序列,其中误差比(n+ 1) /误差(N)是常数。但是,在再次应用Shanks变换之后,这会导致效率低下
https://stackoverflow.com/questions/63185933
复制相似问题