前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蒙特卡洛计算PI(距离公式)+蒙特卡洛计算定积分

蒙特卡洛计算PI(距离公式)+蒙特卡洛计算定积分

作者头像
云深无际
发布2021-08-20 11:26:14
5390
发布2021-08-20 11:26:14
举报
文章被收录于专栏:云深之无迹云深之无迹

蒙特卡洛简单的计算PI的值:

代码语言:javascript
复制
import random
import math
# import matplotlib
M = input('请输入一个较大的整数')
N = 0  # 累计落圆内的随机点的个数,初始值为零


for i in range(int(M)):
    x = random.random()  # 利用random()产生随机数或者是伪随机数
    y = random.random()
    if math.sqrt(x**2+y**2) < 1:  # 判断产生的随机点是否落在单位圆内
        N = N+1  # 对落在圆内的点进行累加

pi = 4*N/int(M)
# 这里是四分之一的圆,乘以4还原

print(pi)

正方形内部有一个相切的圆,它们的面积之比是π/4。现在,在这个正方形内部,随机产生n个点,计算它们与中心点的距离,并且判断是否落在圆的内部。若这些点均匀分布,则圆周率 pi = 4*N/int(M), 其中count表示落到圆内投点数 n:表示总的投点数。

1000次的结果

代码语言:javascript
复制
import random
n = int(input('请输入一个较大的整数'))  # 要确保输入的整数足够大

m = 0


for i in range(n):
    x = random.random()
    y = random.random()
    if x**2 > y:  # 表示该点位于曲线y=x^2的下面
        m = m+1

R = m/n

print(R)

1000次的定积分结果

蒙特卡洛求积分的原理:随机在矩形区域中随机获得一个随机数,

代码语言:javascript
复制
P(x,y)
    if f(x)>y 
count+=1

执行N次,积分=矩形面积*count/N,具体的数学解答,我之后会写,这里就写一个实现就行,因为微信的公式排版不好。

代码语言:javascript
复制
import random


def cal():
    """经典的用蒙特卡洛方法求π值"""
    n = 100000000
    r = 1.0  # 假设圆的半径为1
    a, b = (0.0, 0.0)
    x_neg, x_pos = a - r, a + r  # 得到正方形的x取值范围
    y_neg, y_pos = b - r, b + r  # 得到正方形的y取值范围

    count = 0
    for i in range(0, n):
        x = random.uniform(x_neg, x_pos)
        y = random.uniform(y_neg, y_pos)
        if x * x + y * y <= 1.0:  # 确保坐标点(x,y)在圆形内,count变量+1
            count += 1

    print(count/n*4)


cal()

这个是改进版的计算PI,速度会快很多,所以参数空间到了1亿这个巨大的数字,我啥时候能有这么多的米。

代码语言:javascript
复制
100000000

迭代次数1亿次

这是我的CPU

代码语言:javascript
复制
https://github.com/bitcarmanlee/easy-algorithm-interview-and-practice

在这里链接中,给出了很多的笔记,大家可以来clone学习。

笔记一角

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档