今天派节,也来用 Python 玩玩 π

π节,圆周率日(Pi Day)是庆祝圆周率π的特别日子,由常用近似值3.14而来。

一、库函数计算 π

>>> import math
>>> math.pi
3.141592653589793
>>> math.acos(-1)
3.141592653589793
>>> math.atan(1)*4
3.141592653589793
>>> math.atan2(2,2)*2*2
3.141592653589793

二、近似值计算 π

>>> print(22/7)
3.142857142857143
>>> print(355/113)
3.1415929203539825
>>> print(102573/32650)
3.141592649310873
>>> import math
>>> print(16*math.atan(1/5)-4*math.atan(1/239))
3.1415926535897936
>>> print(32*math.atan(1/10)-4*math.atan(1758719/147153121))
3.1415926535897936
>>> math.pi #比对
3.141592653589793

三、无穷级数计算 π

π/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 ...

pi=0
for i in range(1,10000000):
    pi+=0.5/(i**2-i+0.1875)

print(pi)

'''
3.1415926035880934
>>> 
'''

π = 3 + 4/(2*3*4) - 4/(4*5*6) + 4/(6*7*8) - 4/(8*9*10) + 4/(10*11*12) - 4/(12*13*14) ...

pi=3
for i in range(2,10000000,4):
    pi+=4/(i*(i+1)*(i+2))-4/((i+2)*(i+3)*(i+4))

print(pi)

'''
3.1415926535895253
>>> 
'''

from math import  sqrt
pi=0
for i in range(1,10000000,2):
    pi+=1/(i*i)

print(sqrt(8*pi))

'''
3.141592589927253
>>> 
'''

from math import  sqrt
pi=0
for i in range(1,10000000):
    pi+=1/(i**4)

print(sqrt(sqrt(90*pi)))

'''
3.141592653589592
>>> 
'''

印度天才数学家拉马努金1914年发表了一个圆周率计算公式,每计算一项可以得到8位的十进制精度;以上公式由Jonathan Borwein和Peter Borwein兄弟俩在1987年用基于椭圆积分变换的理论给出证明并改良过后的公式。

from math import  sqrt
from math import  factorial

for j in range(1,6):
    pi=0
    for i in range(j):
        pi+= (26390*i+1103)*factorial(4*i)/(factorial(i)**4)/(396**(4*i))
    print("%.20f"%(1/(2*sqrt(2)*pi/9801)))


'''
3.14159273001330552333
3.14159265358979400418
3.14159265358979311600
3.14159265358979311600
3.14159265358979311600
>>> 
'''

以上代码算到第三项就到精度极限了,应该是python本身精度不够引起的。

四、割圆术计算 π

割圆术:古代(魏晋)数学家刘徽 公元263年《九章算术注》记载,现代数学用三角函数来表示分割的三角形面积,如下切割3亿份就能得到15位精度

>>> from math import sin
>>> sin(2*math.pi/300000000)*300000000/2
3.141592653589793

五、蒙特卡罗法计算 π

方法:单位圆外接一个正方形,然后向其中随机撒点,通过计算落在圆内的点数与总点数之比计算圆周率。以圆心为原点坐标,计算点与原点的距离,距离不于1的有效点数 hits 增一。

from random import random

Dots = 2000000

for j in range(5):
    hits = 0
    for i in range(Dots):
        x,y = random(),random()
        dist = (x**2+y**2)**0.5
        if dist <= 1.0:
            hits+=1
    pi = 4 * (hits/Dots)
    print(pi)

 每次计算距离有三次 ** 运算,所以速度有点慢;精度也不高,200万个点能得出 3.14 两位精度。

猜你喜欢

转载自blog.csdn.net/boysoft2002/article/details/114801480