机器学习 numpy求圆周率π(蒙特卡罗法)

解释一下蒙特卡罗法:
蒙特卡罗法的概念可以解释为利用随机试验求解,重复随机取样仿真出复杂的物理和数学系统模型。

欣赏一下这幅图片理解一下蒙特卡罗的思想
以圆为例,,在这个长宽都为1的坐标轴上,四分之一圆的面积S为S =1/4 * π * 1 * 1,π=4 * S,在坐标轴随机出X个点,与原点距离<=1的点(坐标轴中红点)即为圆内的点,个数为t,面积S可视与红点个数除以总个数X。π即等于4 * (t / X)。
在这里插入图片描述
用代码实现上述坐标:

import matplotlib.pyplot as plt
import numpy as np
# 运用np.random随机生成1000个点
x=np.random.rand(1000)
y=np.random.rand(1000)
# 转化为坐标格式
X=np.c_[x,y]
# 计算出与原点距离<=1的点
incircle=X[X[:,0]**2+X[:,1]**2<=1]
# 可视化 
plt.figure(figsize=(9,9))
plt.scatter(x,y,c='b',s=8)
plt.scatter(incircle[:,0],incircle[:,1],c='r',s=8)
# 分界线可视化 可注释
t=np.sqrt(1-x**2) 
plt.scatter(x,t,c='k',s=2)
# 求出相似π
PI=4*incircle.shape[0]/X.shape[0]

由于代码只随机出1000个点,计算出的π偏差较大。
在这里插入图片描述

—————————————————————————————

x=np.random.rand(100000000)
y=np.random.rand(100000000)

随机10000000个点 得出的π结果近似真实值 (随机数量越大计算量越大,画图耗时时会很长,建议不要超过一千万)
在这里插入图片描述
另一种写法:放到一整个圆中
思路:在正方形区域内随机投点,统计落在圆内的点的数目,求出圆内点数与总点数比例求近似π。(画图耗时较长,建议点数不要超过5000)。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
# 随机点数
n=1000
# 半径 原点
r=1.0        
a,b=(0.,0.)
# 正方形区域边界
x_min,x_max=a-r,a+r
y_min,y_max=b-r,b+r
# 在正方形区域内随机投点
x=np.random.uniform(x_min,x_max,n)   # 均匀分布
y=np.random.uniform(y_min,y_max,n)   # 均匀分布
# 计算 点到圆心的距离
t=np.sqrt((x-a)**2+(y-b)**2)
# 统计落在圆内的点的数目
index=np.where(t<=r,1,0)
res=sum(index)
# 计算 pi 的近似值
pi=4*res/n
# 可视化
fig=plt.figure(figsize=(9,9))
axes=fig.add_subplot(111) 
for i in range(len(index)):
    if index[i]==1:
        axes.plot(x[i],y[i],'ro',markersize=3,color='r')
    else:
        axes.plot(x[i],y[i],'ro',markersize=3,color='b')
circle=Circle(xy=(a,b),radius=r,alpha=0.1,facecolor='y')
axes.add_patch(circle)
print(pi)

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值