python - 用于计算 Pi 的加速莱布尼茨级数
问题描述
当我学习数学时,我读到了名为 Leibniz Series for Pi 的系列:
所以我为它做了一个程序,总结了这个系列的 n 项:
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。但我更困惑我该如何编程。
编辑:
我了解了香克斯变换并对其进行了编程
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 变换并继续加速系列。但是现在的问题是,由于递归,它非常慢,如果增加深度,精度并没有提高。
这就是香克斯转型的低效吗
解决方案
所以在考虑之后,我想出了在 My this shanks transformation 中减少缓存。
它并没有改善很多,但仍然是一个很好的改进。
这里是:
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 变换仅适用于这样的序列,其中 Error(n + 1) / Error(n) 的比率是一个常数。但是在再次应用 Shanks 变换后,这可能会导致效率低下
推荐阅读
- c++ - 排序时堆栈溢出(合并排序和快速排序)
- ms-access - 在 MS Access 中使复选框大小变大
- python - 根据另一列中的值将多列设置为零
- c# - Open API (Swagger) 路由命名约定
- c++ - 未调用继承的模板构造函数
- python - 如何将一个简单的系列转换为 Keras LSTM?
- r - 将函数应用于 R data.frame 中另一列的一系列值以使其保持矢量化的最佳方法是什么?
- apache2 - magento2 板没有正确显示
- c++11 - emplace_back 是否在其新位置构造对象而不是使用移动?
- javascript - removeAttribute 不删除 CSS 样式