首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速计算Pi的Leibniz级数

加速计算Pi的Leibniz级数
EN

Stack Overflow用户
提问于 2020-07-31 04:44:38
回答 1查看 288关注 0票数 0

在我学习数学的时候,我读到了关于名为Leibniz series for Pi的系列文章:

所以我为它做了一个程序,用这个系列的数字来表示:

代码语言:javascript
复制
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。

  • 因此,我读到了不同系列的加速,基本上,在我的例子中最好的是欧拉加速度
  • 缓慢的收敛是因为我的版本是一个交替的系列,即包含(-1)^n,但我更困惑的是如何编写它。

编辑:

我了解了Shanks变换并编写了程序

代码语言:javascript
复制
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变换的低效吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-01 14:04:12

因此,经过周密的思考,我在我的小腿变换中想到了Cache减缩。

它并不是很重要,但仍然是一个很好的改进。

下面是:

代码语言:javascript
复制
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变换之后,这会导致效率低下

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63185933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档