首页 > 百科知识 正文

Python详解π的计算(python解决数值计算问题)

时间:2023-11-20 11:18:50 阅读:178 作者:小雏菊的爱

在数学界,有这么一个困扰人们多年的问题,至今都有人在研究,那就是大名鼎鼎的——π。

π在数学界十分出名的,圆的面积公式就用到了π,S=πr²,π=3.14相信大家肯定知道吧,有些人或许能背得更多(你能背到几呢?欢迎评论![偷笑])。

但你以为就此结束了吗?目前,人们通过超级计算机算到了π的第808亿位,可是你知道他们是用什么方法算的吗?

今天,就给大家科普科普,以及用Python实现一下。

1、BBP公式

BBP公式,又称贝利-波尔温-普劳夫公式,具体公式如下:

Python详解π的计算(python解决数值计算问题)-第1张

这公式看起来很复杂,实际就是求和公式的简化,原式子:

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、蒙特卡罗算法

Python详解π的计算(python解决数值计算问题)-第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越多越精准。

今天就给大家分享到这里![强]

大家还知道什么计算圆周率π的方法吗?欢迎留言!

版权声明:该问答观点仅代表作者本人。如有侵犯您版权权利请告知 cpumjj@hotmail.com,我们将尽快删除相关内容。