请推导一个圆周率兀的计算公式,谢啦!

作者&投稿:苗蚀 (若有异议请与网页底部的电邮联系)
级数中圆周率如何推导出来的?~

1/(1+X*2)=1—X*2+X*4-……+(-1)*(n—1)xX*(2n—2)+……
积分导出:
arctanX=X—X*3/3+X*5/5-……+(-1)*(n—1)x[X*(2n—1)]/[2n—1]+……
取X=1;
π/4=1—1/3+1/5—……+(-1)*(n—1)[1/(2n—1)]+……
即可得出。
其中*表示乘方,x表示乘号,X表示字母X。

S圆=S长方形=πR*R
图中长方形的长=πR,宽=R

第一类算法:arctan 的级数展开
PI/4 = 4 arctan(1/5) - arctan(1/239) (1)
arctan(x) = x - x3/3 + x5/5 - x7/7 + .... (2)
很容易想到,要得到超高精度的 PI 值,实数在计算机中必须以数组的形式进行存取,数组的大小跟所需的有效位数成正比。在这个算法中,PI 的有效位数 n 随 (2) 的求和项数线性增加。而为计算 (2) 中的每一项,需要进行超高精度实数除以小整数(52, 2392, 2k+1)的循环,循环所需次数也跟 n 成正比。所以,这个算法总的时间复杂度为 O(n2)。

这个算法的优点是简单,而且只需要进行整数运算。下面给出我写的算 PI 程序。在程序中,我采用了一些提高速度的措施:超高精度实数以数组的形式进行存取,数组元素的类型为 64 位整数(long long),每个元素储存 12 个十进制位;对 xk (x = 1/5, 1/239) 的头部和尾部的 0 的数量进行估计,只对非 0 的部分进行计算。

pi.cpp C++ 源程序,在 Linux 下以 g++ pi.cpp -o pi -O2 编译
pi.s 在 g++ 生成的汇编程序的基础上进行修改,速度更快,在 Linux 下以 g++ pi.s -o pi 编译
另外,还有许多跟 (1) 类似的式子,但不常用。例如:

PI/4 = arctan(1/2) + arctan(1/3)
PI/4 = 8 arctan(1/10) - arctan(1/239) - 4 arctan(1/515)
第二类算法:与 1/PI 有关的级数
1/PI = (sqrt(8) / 9801) sumk=0~inf { [(4k)! (1103 + 26390k)] / [(k!)4 3964k] } (Ramanujan)
1/PI = (sqrt(10005) / 4270934400) sumk=0~inf { [(6k)! (13591409 + 545140134k)] / [(k!)3 (3k)! (-640320)3k] } (Chudnovsky)
以上两个级数(还有其它类似形式的级数,但不常用)比起 arctan 的泰勒级数要复杂得多。虽然仍然是线性收敛,总的时间复杂度也仍然是 O(n2),但它们的收敛速度相当快, (Ramanujan) 每项可以增加 8 位有效数字, (Chudnovsky) 每项可以增加 14 位。

在这个算法中,除了要进行超高精度实数(数组形式)和小整数的运算外,还有一次超高精度实数的开方和倒数的运算,这需要用到 FFT(快速傅立叶变换),在下文叙述。

第三类算法:算术几何平均值和迭代法
算术几何平均值(Arithmetic-Geometric Mean, AGM) M(a, b) 定义如下:

a0 = a, b0 = b
ak = (ak-1 + bk-1) / 2, bk = sqrt(ak-1 bk-1)
M(a, b) = limk->inf ak = limk->inf bk
然后,由椭圆积分的一系列理论(抱歉,过程我不懂)可以推导出如下公式:

a0 = 1, b0 = 1 / sqrt(2)
1/PI = { 1 - sumk=0~inf [2k (ak2 - bk2)] } / 2M(a0, b0)2 (AGM)
根据这条公式可以制定适当的迭代算法。在迭代过程中,有效位数随迭代次数按 2 的指数增加,即每迭代一次有效位数乘 2。算法中的超高精度实数的乘、除、开方等运算需要使用 FFT,在下文叙述。综合考虑 FFT 的时间复杂度,整个算法的时间复杂度约为 O(n log(n)2)。

除了 (AGM) 以外,还有其它的迭代序列,它们具有同样的时间复杂度。例如下面的这个序列将按 4 的指数收敛到 1/PI:

y0 = sqrt(2) - 1, a0 = 6 - 4 sqrt(2)
yk = [1 - sqrt(sqrt(1 - yk-14))] / [1 + sqrt(sqrt(1 - yk-14))], ak = (1 + yk)4 ak-1 - 22k+1 yk (1 + yk + yk2)
1/PI = limk->inf ak (Borwein)
FFT
如上所述,第二和第三类算法不可避免地要涉及超高精度实数(数组形式存取的多位数)的乘、除、开方等运算。多位数乘法如果按照常规方法来计算,逐位相乘然后相加,其时间复杂度将达到 O(n2)。使用 FFT 可大大减少计算量。

设有复数数组 a[k] 和 b[k] (k=0~n-1),正向和反向的离散傅立叶变换(DFT)定义如下: (i = sqrt(-1))

b = FFTforward(a) : b[k] = sumj=0~n-1 ( a[j] e-i*j*2PI*k/n ) (3)
b = FFTbackward(a) : b[k] = (1/n) sumj=0~n-1 ( a[j] ei*j*2PI*k/n ) (4)
(3) 和 (4) 中的 (1/n) 可以放在任何一个式子中,也可以拆成 (1/sqrt(n)) 同时放在两个式子中,目的是保证正向和反向傅立叶变换以后不会相差一个因子。

当 n 的所有素因子均为小整数,尤其是当 n 为 2 的整数次幂的时候,使用适当的算法经过仔细的协调,可以避免多余的计算,使离散傅立叶变换 (3) 和 (4) 减少至 O(n log(n)) 的时间复杂度,即所谓的快速傅立叶变换(FFT)。具体的细节请查阅相关书籍。下面给出我写的一段 FFT 程序,仅供参考。另外也有已经开发的 FFT 函数库,例如 FFTW ,可以直接使用。

fft.cpp FFT 的 C++ 源程序
利用 FFT,要计算 n1 位和 n2 位的两个多位数乘法,可以这样进行:开辟两个长度为 n(n>=n1+n2,取 2m 最佳) 的复数数组,将两个多位数从低位到高位分别填入,高位补 0。对两个数组分别进行正向傅立叶变换。将得到的两个变换后的数组的对应项相乘,然后进行反向傅立叶变换,最后得到一个结果数组。由于傅立叶变换是在复数域中进行的,因此还要对结果数组进行取整和进位,才能得到最终的乘积。

值得留意的是傅立叶变换的精度问题。我们知道,在计算机中实数用单精度数或双精度数表示,它们会存在一定的误差。在计算多位数乘法时,n 往往是一个很大的数字,傅立叶变换过程中需要对数组的每一项进行求和,如何保证精度带来的误差不会因为求和而超出允许的范围?我的观点是必须使用双精度实数,而且由于统计特性,精度带来的误差在求和过程中不会很大,一般不会影响计算的正确性。如果需要保证计算的正确性,我想到两种检查方法。第一种是取模验算。例如,如果乘数和被乘数对 17 的模分别是 8 和 6,那么积对 17 的模就应该是 14。第二种是检查运算结果中浮点数偏离整数的最大值。如果偏差只有比如 10-3 量级,我们可以认为这个尺度的乘法运算很安全;如果偏差达到 0.5,说明运算已经出错了;如果偏差达到 0.1 量级,那也比较危险,也许换个别的乘数和被乘数就溢出了。

多位数的倒数和开方可以通过牛顿迭代求根法转化为乘法运算。例如,要计算 x = 1/a ,根据牛顿迭代法令 f(x) = 1/x - a ,可以得到以下迭代序列:

x0 ~= 1/a
xk = xk-1 - f(xk-1)/f'(xk-1) = 2xk-1 - axk-12 (5)
要计算 x = sqrt(a) ,可以先计算 x = 1 / sqrt(a) ,令 f(x) = 1/x2 - a ,可以得到以下迭代序列:

x0 ~= 1 / sqrt(a)
xk = xk-1 - f(xk-1)/f'(xk-1) = (3/2)xk-1 - (1/2)axk-13 (6)
(5) 和 (6) 均以 2 的指数收敛到所求结果。还存在其它更复杂一些的迭代序列,它们以更高的指数收敛,在此不提。不过需要提醒的是,跟 (AGM) 不同,这里 (5) 和 (6) 中的 x0 只是 1/a 和 1 / sqrt(a) 的约值,在前几次的迭代中不必进行满 n 位数的乘法运算,因而可以减少计算量。

相信这些你也恩能够找到,仅供参考吧:

圆周率的计算方法:
http://it.icxo.com/htmlnews/2004/09/13/335681.htm
这个比较全面好用。

但是要讲最基本原理就需要最基本的定义了:
定义: 圆的周长
π(圆周率)= —————
直径

在一个圆上作『内接正N边形』和『外切正N边形』, 当N越大时,所作出来的这两个正N边形的『周长』也就会越接近。 这个『周长』也就会越接近这个圆的圆周了
这方法好理解但是很不方便,计算麻烦。

http://forum.tech.sina.com.cn/cgi-bin/view.cgi?gid=23&fid=295&thread=14311&date=20050504
这个也还好理解,道理也比较清楚:
⑴ π=180°sinθ∕θ 、
⑵ π=180°tgθ∕θ 、
(θ→0°θ>0°)
一、计算正24576边形的圆周率(祖率)
∴ θ=180°∕24576=0.007324219°
∴ ⑴ π=180°sinθ∕θ
=180°×sin0.007324219∕0.007324219
=3.1415926
∴ ⑵ π=180°tgθ∕θ
=180°×tg0.007324219∕0.007324219
=3.1415927
二、计算30位精度的圆周率
一般地,θ小数每增加一位,则π值有效值增加两位。
为了简化运算,θ取值为1.8°×10^(-15)即可。
∴ ⑴ π=180°sinθ∕θ
=sin(1.8°×10^(-15))×180°∕1.8°×10^(-15)
=3.14159 26535 89793 23846 26433 83279 5×10^(-17)
×180°∕1.8°×10^(-15)
=3.14159 26535 89793 23846 26433 83279 5
∴ ⑵ π=180°tgθ∕θ
=tg(1.8°×10^(-15))×180°∕1.8°×10^(-15)
=3.14159 26535 89793 23846 26433 83279 5×10^(-17)
×180°∕1.8°×10^(-15)
=3.14159 26535 89793 23846 26433 83279 5

高斯-勒让德算术几何平均值法计算PI
定义数列A,B使
A(1)=1,B(1)=1/SQR(2)
A(n)=(A(n-1)+B(n-1))/2
B(n)=SQR(A(n-1)*B(n-1))
则PI=lim(k无穷大)
k
(A(k)+B(k))^2/(1 - SUM (A(K)-B(K))*2^n)
n=0
据说与椭圆积分有关。

割圆术


圆周率π怎么算?
人们都说:“圆周率π=圆的周长除以圆的直径”。可实际上,只有我国西汉的刘歆直接与“已知圆的直径推出圆的周长后再用圆的周长除以圆的直径”得来的3.1547005383...为圆周率π值。而世界各国,大多数人都是与“已知圆的直径相等的正n边形的对角线推出正n边形的周长后再用正n边形的周长除以正n边...

圆周率π怎么背?
- π是一个无理数,即无限不循环小数。在日常生活中,通常用3.14代表π进行近似计算。而使用10位小数3.141592654已足够应对大多数计算。即使是对工程师或物理学家来说,进行较精密计算时,也只需取值到小数点后几百位。3. 其他背诵方法:- 建立五个地点,对应五行数字,如果记忆内容较多,则需要建立...

兀是怎样被发现和计算出的
圆的周长与直径之比是一个常数,人们称之为圆周率。通常用希腊字母π 来表示。1706年,英国人琼斯首次创用π 代表圆周率。他的符号并未立刻被采用,以后,欧拉予以提倡,才渐渐推广开来。现在π 已成为圆周率的专用符号, π的研究,在一定程度上反映这个地区或时代的数学水平,它的历史是饶有趣味的。在...

圆周率公式?
圆周率是一个数学常数,通常用希腊字母 π 表示。它是圆的周长与直径的比值,也可以通过级数公式来计算。以下是两种常见的圆周率公式:1. π = 圆的周长 ÷ 圆的直径 2. π = 4 × [1 - 1\/3 + 1\/5 - 1\/7 + 1\/9 - 1\/11 + ...]其中,第二个公式是莱布尼兹级数(Leibniz formula)...

圆周率兀怎么计算?
圆周率是一个数学常数,用希腊字母 pi 表示,其值约等于 3.14159265358979323846…圆周率精确的计算是一个无限不循环小数,因此我们一般采用无限级数或其他方法来逼近圆周率的值。以下介绍几种计算圆周率的方法:1. 利用无限级数计算圆周率圆周率可以表示为如下的无限级数:$$\\pi = 4\\sum_{n=0}^{\\infty}...

圆周率表
数学中“π”是一个无限不循环小数,约等于3.14,400位数字表如下:圆周率用希腊字母π(读作pài)表示,是一个常数(约等于3.141592653),是代表圆周长和直径的比值。它是一个无理数,即无限不循环小数。在日常生活中,通常都用3.14代表圆周率去进行近似计算。而用十位小数3.141592653便足以应付...

圆周率口诀表
圆周率口诀表如下:1π=3.14、2π=6.28、3π=9.42、4π=12.56、5π=15.7、6π=18.84、7π=21.98、8π=25.12、9π=28.26、10π=31.4、11π=34.54、12π=37.68、13π=40.82、14π=43.96。1.圆周率的定义和意义:圆周率是一个数学常数,用字母π表示,代表圆的周长与直径...

兀的圆周率是什么?
圆周率兀是圆的周长与直径的比值,一般用希腊字母π表示,是一个在数学及物理学中普遍存在的数学常数。π也等于圆形之面积与半径平方之比。是精确计算圆周长、圆面积、球体积等几何形状的关键值。在分析学里,π可以严格地定义为满足sin x = 0的最小正实数x。圆周率用字母兀表示,是一个常数(约等于...

π怎么算?
π(圆周率)是一个无理数,它的近似值是3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679...。计算π的方法有很多种,包括割圆法、圆形面积法、披萨法等。在数学中,有多种方法可以计算π的近似值,其中一种常见的方法是使用级数展开式,如莱布尼茨级数或马刁尼...

如何证明π是圆周率?
这有两个步骤:1.证明圆周率是恒数.2.计算圆周率的大小.第一个步骤看起来很简单,但其实颇深奥.例如你要先定义什么是圆周?一般的曲线长度的定义是把它近似成很多小小的直线线段连成的间隔,然后取间隔数趋紧无限大的极限.所以你要先证明对圆周做这种间隔的极限存在.一个方法是证明外界正多边形的变长边数...

东坡区13713107719: 请推导一个圆周率兀的计算公式,谢啦! -
彤储复方: 相信这些你也恩能够找到,仅供参考吧:圆周率的计算方法: http://it.icxo.com/htmlnews/2004/09/13/335681.htm 这个比较全面好用.但是要讲最基本原理就需要最基本的定义了:定义: 圆的周长π(圆周率)= —————直径在一个圆上...

东坡区13713107719: 圆周率公式 -
彤储复方: 圆周率是没有确定的计算公式的,不过根据圆周率的定义是圆的周长与直径的比值,可以看成π=C/D,但是要求准确的C也只能在π已知的情况下. 在微积分之前是用正多边形无限逼近圆,从而近似计算圆的周长.有了微积分之后都是用反三角函数的泰勒展开式近似计算,arctanX=X-(X^3)/3+(x^5)/5-(x^7)/7.....取X=1,可以得π/4=1-1/3+1/5-1/7... 就可以近似得到π的值.

东坡区13713107719: 下面的圆周率计算公式怎么推导?
彤储复方: 设 f(x)=x-x³/3+(x^5)/5-(x^7)/7+……+(-1)ⁿx*x²ⁿ/(2n+1)+……f'(x)=1-x²+(x²)²-(x²)³+……+(-x²)ⁿ+……=1/(1+x²)f(x)-f(0)=∫【0,x】dx/(1+x²)=arctanx-arctan0∵ f(0)=0,arctan0=0,∴ f(x)=arctanx4f(1)=4arctan1=4*π/4=π//设 g(x)=(x^4)/(2*3*4)-(x...

东坡区13713107719: 圆周率的计算公式是什么? -
彤储复方: 圆周率(Pi)是圆的周长与直径的比值.一般用希腊字母π表示.π=圆周长/直径≈内接正多边形/直径.当正多边形的边长越多时,其周长就越接近于圆的周长.“兀”是由我国古代数学家祖冲之的割圆术求出来的.圆周率(Pi)是圆的周长与直...

东坡区13713107719: 什么是割圆法求圆周率?请帮忙列出具体如何求出π的步骤? -
彤储复方:[答案] 古人计算圆周率,一般是用割圆法.即用圆的内接或外切正多边形来逼近圆的周长.阿基米德用正96边形得到圆周率小数点后3位的精度;刘徽用正3072边形得到5位精度;鲁道夫用正262边形得到了35位精度.这种基于几何的算法计算量大,速度慢,吃...

东坡区13713107719: 圆周率的公式 -
彤储复方: 圆周率π是单位圆内接正n边长的半周长,既π=Ln=nsin(180°/n)的极限

东坡区13713107719: 是关于计算机,计算圆周率的一个公式!①π=2^n*√(2 - √(2+…√2+)…) ②π=3*2^n*√(2 - √(2+…√(2+√3)…) ③π=2*2^n*√(2 - √(2+…√2+)…)/√(2+√(2+…... -
彤储复方:[答案] 这是计算圆周率的四个不同公式,都可以求得π,√表示从此符号以后的()内都在此根号里面,如π=2^n*√(2-√(2+…√2+)…) 表示π=2的n次方乘以(2-√(2+…√2+)…)的根号(即0.5次方) . 这四个公式对求π的速度是不同的,也就是极限的收...

东坡区13713107719: 圆周率π是如何得出来的?π的计算公式又是什么? -
彤储复方: 开始是估算:“径一周三”就是一个结果;后来比较出名的就是割圆术,现在基本都是编程序让计算机计算出来的.π的计算公式有以下一些: π/4=1-1/3+1/5-1/7+...... π²/6=1+1/2²+1/3²+1/4²+...... π²/8=1+1/3²+1/5²+1/7²+...... π²/12=1-1/...

东坡区13713107719: 圆周率最简单的算法 可以自己算的 -
彤储复方: π=4(1-1/3+1/5-1/7+……)这应该是π最简单的算法了,但右边的级数收敛很慢,哪怕是计算π的几位精确值,也许算几千几万项. π=16(0.2-0.2^3/3+0.2^5/5-0.2^7/7+……)-4(1/239-(1/239)^3/3+(1/239)^5/5-(1/239)^7/7+……)这个公式收敛较快,每计算一项,可得到π的1.4位10进制精度.

东坡区13713107719: 圆周率是怎么算出来的? -
彤储复方: 圆周率是一个圆的周长与直径的比值,可用圆的周长除以直径计算圆周率.圆周率一般用希腊字母π表示.π=圆周长/直径≈内接正多边形/直径.当正多边形的边长越多时,其周长就越接近于圆的周长.“π”是由我国古代数学家祖冲之的割圆术...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网