当前位置:   article > 正文

Python中利用BBP方式和蒙卡罗特方法求出π值(以及运用函数进行选择方式解决问题)_python用bbp公式求圆周率

python用bbp公式求圆周率


在这里插入图片描述

一 BBP方式

所谓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))
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果为:

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

0.008259320256459906

如果把这种方法放在一个函数里呢,直接调用函数便可执行操作BBP方式

这也灰常简单,首先我们要了解函数的创建以及简单的调用方式

函数的创建格式

 def 函数名(参数):
     函数体
     return **
  • 1
  • 2
  • 3

简单函数创建举例

def fun(n):
    n+=100
    print(n)
    return n
  • 1
  • 2
  • 3
  • 4

调用fun函数

fun(100)
  • 1

运行结果为

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行结果为:

pi值为3.14159

二 蒙卡罗特方法

简单的来说,就是在一个正方形中进行随机投点,观察在圆中的点数与所有投点数的比值就是π值
一个圆不好分析,我们就直接分析其四分之一
如下图:
π=4×红色点数/(红色点数+绿色点数)

在这里插入图片描述
那我们如何用Python代码实现其操作呢?
首先要进行 随机投点这就用到random库中的random()函数
该函数是随机产生一个0~1直接的数值

import random
x=random.random()
print(x)
  • 1
  • 2
  • 3

多次运行结果为:

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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果为:

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()  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行结果:

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('输入错误')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

在这里插入图片描述

新手小白,有何不妥,请您提出,还需努力!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/424042
推荐阅读
相关标签