python解决简单数学计算:Python详解π的计算
python解决简单数学计算:Python详解π的计算π=[1/(16^k)]*[4/(8^k 1)-2/(8^k 4)-1/(8*k 5)-1/(8*k 6)]k=01、BBP公式BBP公式,又称贝利-波尔温-普劳夫公式,具体公式如下:这公式看起来很复杂,实际就是求和公式的简化,原式子:
在数学界,有这么一个困扰人们多年的问题,至今都有人在研究,那就是大名鼎鼎的——π。
π在数学界十分出名的,圆的面积公式就用到了π,S=πr²,π=3.14相信大家肯定知道吧,有些人或许能背得更多(你能背到几呢?欢迎评论![偷笑])。
但你以为就此结束了吗?目前,人们通过超级计算机算到了π的第808亿位,可是你知道他们是用什么方法算的吗?
今天,就给大家科普科普,以及用Python实现一下。
1、BBP公式
BBP公式,又称贝利-波尔温-普劳夫公式,具体公式如下:
这公式看起来很复杂,实际就是求和公式的简化,原式子:
k=0
π=[1/(16^k)]*[4/(8^k 1)-2/(8^k 4)-1/(8*k 5)-1/(8*k 6)]
k=1
π =[1/(16^k)]*[4/(8^k 1)-2/(8^k 4)-1/(8*k 5)-1/(8*k 6)]
k=2
π =[1/(16^k)]*[4/(8^k 1)-2/(8^k 4)-1/(8*k 5)-1/(8*k 6)]
k=3
……
k=无限
π =[1/(16^k)]*[4/(8^k 1)-2/(8^k 4)-1/(8*k 5)-1/(8*k 6)]
这个用Python实现十分简单:
k=0
times=1000
pi=0
for i in range(times):
pi =(1/pow(16 k))*(4/(8*k 1)-2/(8*k 4)-1/(8*k 5)-1/(8*k 6))
k =1
pi就代表π
k是从0~times
times是k的最大值
π=3.141592653589793
不知大家学了decimal标准库了没有
import decimal
a=decimal.Decimal(1.23456789)
b=decimal.Decimal(3.141592653589793)
decimal.getcontext().prec=20
print(a*b)
结果可以精确小数点后20位
我们也可以将π精确化,顺便加计时:
import decimal as dec
import time
start=time.time()
k=0
times=1000
pi=0
for i in range(times):
pi =(1/pow(16 k))*(4/(8*k 1)-2/(8*k 4)-1/(8*k 5)-1/(8*k 6))
k =1
end=time.time()
pi=dec.Decimal(pi)
dec.getcontext().prec=20
print("pi:" str(pi))
print("time:" str(end-start))
pi=3.141592653589793115997963468544185161590576171875
这是个万能公式![思考]
2、蒙特卡罗算法
步骤如下:
如图所示的单位正方形和圆,随机抛洒点在正方形里 计算每个点到圆心的距离(0 0) 从而得出点在圆内或圆外 用园内点数除以总点数就是π/4值 点个数越大越,π越精准。
这里有个小知识:
求二维坐标轴中任意一点到(0 0)点的距离=根号(x² y²)
import random
import math
import time
import decimal
darts=1000000
hits=0
start=time.time()
for i in range(1 darts 1):
x y=random.random() random.random()
dist=math.sqrt(x**2 y**2)
if dist<=1:
hits =1
pi=4*(hits/darts)
pi=decimal.Decimal(pi)
decimal.getcontext().prec=20
end=time.time()
print("pi:" str(pi))
print("times:" str(end-start))
darts是点数
hits是在圆内的点数
x y是坐标
dist是到(0 0)的距离
得pi=3.14155199999999990012611306156031787395477294921875
不是很精准,但比较接近了,darts越多越精准。
今天就给大家分享到这里![强]
大家还知道什么计算圆周率π的方法吗?欢迎留言!