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

蒙特卡洛简单的计算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(x2+y2) < 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 &lt;= 1.0:  # 确保坐标点(x,y)在圆形内,count变量+1
        count += 1

print(count/n*4)

cal()

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

代码语言:javascript
复制
100000000

迭代次数1亿次

这是我的CPU

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

笔记一角