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))

运行结果为:

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('输入错误')

在这里插入图片描述

新手小白,有何不妥,请您提出,还需努力!!!
👍+✏️+⭐️ 是对博主最大的鼓励与支持!!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汴京城下君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值