蒙特卡罗法(Python实现)

本文介绍了蒙特卡罗方法,这是一种通过随机抽样进行数值计算的统计模拟方法。以求解圆周率为实例,阐述了蒙特卡罗法的基本步骤:构造随机概率过程、从概率分布抽样和求解估计量。通过在正方形内随机散点并计算落在圆内的点的比例,随着样本数量增加,可近似得到π的值。提供了Python代码实现,并展示了随着试验次数增加,π的估算更加精确。

Hello,大家好,我是茶哩,我们来学习一个有意思的算法,蒙特卡罗方法。


简介

蒙特卡罗法(统计模拟方法)是通过从概率模型的随机抽样进行近似数值计算的方法。蒙特卡罗是一个赌场的名字,是一类基于概率的模型的统称。

工作原理

  • 不断随机抽样
  • 逐渐逼近结果

一般来说,采样越多,越近似最优解,而永远不是最优解。

基本步骤

蒙特卡罗算法的基本步骤

蒙特卡罗算法一般分为三个步骤,包括构造随机的概率的过程,从构造随机概率分布中抽样,求解估计量。

1 构造随机的概率过程
要求解一个确定性的问题,需要事先构造一个概率过程,将其转化为随机性问题,即随机点落在圆内的概率,而π就是所要求的解。

2 从已知概率分布抽样
由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量,就成为实现蒙特卡罗方法模拟实验的基本手段。如本例中采用的就是最简单、最基本的(0,1)上的均匀分布,而随机数是我们实现蒙特卡罗模拟的基本工具。

3 求解估计量
实现模拟实验后,要确定一个随机变量,作为所要求问题的解,即无偏估计。建立估计量,相当于对实验结果进行考察,从而得到问题的解。如求出的近似π就认为是一种无偏估计。

求圆周率π的python实例

将一个单位圆(1x1)放在一个正方形中,通过计算圆的面积和正方形的面积之比,进而得到圆周率。
向该正方形随机散点,则每个点落在单位圆上的概率为 π ∗ 0. 5 2 π*0.5^2 π0.52 / 1 ∗ 1 1*1 11=0.25π,假设总散点数为S,落在圆内的点数为N。只要实验次数足够多,就越逼近近似值。
因此,当 S 足够大时,我们可以简单认为:0.25π = N/S ,即π = 4N/S

import numpy as np
import random 

S = [1e4,1e5,1e6,1e7]# 试验总次数
r = 0.5 #半径

for i in S:
    N = 0 # 落在圆内的试验点的个数
    for j in range(int(i)):
        x = random.random() # 获取0-1之间的随机数
        y = random.random() # 获取0-1之间的随机数
        d = np.sqrt((x-0.5)**2+(y-0.5)**2) # 计算试验点到圆心的欧式距离的平方
        if d<=r: # 通过比较试验点到圆心的欧式距离与圆半径的大小,判断该点是否在圆内
            N+=1
        else:
            pass
    PI = 4*N/i
    print("实验总次数:{}\tPI:{}".format(i,PI))

在这里插入图片描述
参考:
https://zhuanlan.zhihu.com/p/150729238


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

茶冻茶茶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值