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

2021-08-20 11:26:14 浏览数 (2)

蒙特卡洛简单的计算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学习。

笔记一角

0 人点赞