赞
踩
所谓BBP方式就是利用下面所给数学计算公式求出π值
我们这里用Python代码解决:
看到k值 从0开始到无限大,首先想到for-in循环
剩下的就是在循环体内,用公式进行计算
代码如下:
dates=2000
p=0
for k in range(dates+1):
p+=1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))
print('pi值为{:.5f}'.format(p))
运行结果为:
pi值为3.14159
注意:
若其中K不是从0开始则运行结果错误
N=2000
pi=0
for k in range(1,N+1):
pi += 1 / pow(16, k) * (4 / (8 * k + 1) - 2 / (8 * k + 4) - 1 / (8 * k + 5) - 1 / (8 * k + 6))
print(pi)
0.008259320256459906
如果把这种方法放在一个函数里呢,直接调用函数便可执行操作BBP方式
这也灰常简单,首先我们要了解函数的创建以及简单的调用方式
函数的创建格式:
def 函数名(参数):
函数体
return **
简单函数创建举例:
def fun(n):
n+=100
print(n)
return n
调用fun函数:
fun(100)
运行结果为:
200
所以我们可以直接将上面代码放在一个函数的函数体中,大致就可以了
代码如下:
def BBP():
dates=2000
p=0
for k in range(dates+1):
p+=1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))
print('pi值为{:.5f}'.format(p))
BBP()
运行结果为:
pi值为3.14159
简单的来说,就是在一个正方形中进行随机投点,观察在圆中的点数与所有投点数的比值就是π值
一个圆不好分析,我们就直接分析其四分之一
如下图:
π=4×红色点数/(红色点数+绿色点数)
那我们如何用Python代码实现其操作呢?
首先要进行 随机投点这就用到random库中的random()函数
该函数是随机产生一个0~1直接的数值
import random
x=random.random()
print(x)
多次运行结果为:
0.8701789869057365
0.2964643122013735
0.25537645260810016
0.10197045184352915
然后对所投的点进行判断,如果到原点(0,0)距离在1之内(包含1)是不是就在圆之内了呢?
如果在圆内就对自己定义的一个变量进行累加,最后用累加的变量/总量再×4是不是就为π值了呢
整体代码如下:
import random
import math
date = 10000000
hits = 0.0
for i in range(1, date + 1):
x, y = random.random(), random.random()
dist = math.sqrt(x ** 2 + y ** 2)
if dist <= 1.0:
hits += 1
pi = 4 * (hits / date)
print('pi值为{:.5f}'.format(pi))
运行结果为:
pi值为3.14178
根据方法一种的函数定义方法,这个我们是不是也可以对其进行定义一个函数呢?
代码如下:
import random
import math
def luo():
date=10000000
hits=0.0
for i in range(1,date+1):
x,y=random.random(),random.random()
dist=math.sqrt(x**2+y**2)
if dist<=1.0:
hits+=1
pi=4*(hits/date)
print('pi值为{:.5f}'.format(pi))
luo()
运行结果:
pi值为3.14178
首先把这两种方法分别定义函数,之后运用if-else条件语句进行选择执行即可
代码如下:
import random import math def luo(): date=10000000 hits=0.0 for i in range(date+1): x,y=random.random(),random.random() dist=math.sqrt(x**2+y**2) if dist<=1.0: hits+=1 pi=4*(hits/date) print('pi值为{:.5f}'.format(pi)) #luo() 测试成功 def BBP(): dates=2000 p=0 for k in range(dates+1): p+=1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6)) print('pi值为{:.5f}'.format(p)) #BBP() 测试成功 print('请选择输入’计算公式‘或者’蒙卡罗特方法‘:') a=input() if a=='计算公式': BBP() elif a=='蒙卡罗特方法': luo() else: print('输入错误')
新手小白,有何不妥,请您提出,还需努力!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。