最近遇上了需要仿真模拟采样相关的工作,之前接触过比较牛的方法之一就是蒙特卡罗方法,对于这个随机采样方法的了解过,但是详细的概念什么的早已记不住了,这里给出来百度百科的定义:

蒙特·卡罗方法简介
蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。与它对应的是确定性算法。蒙特·卡罗方法在金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域应用广泛。提出
蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的“曼哈顿计划”计划的成员S.M.乌拉姆和J.冯·诺伊曼首先提出。数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。在这之前,蒙特卡罗方法就已经存在。1777年,法国数学家布丰(Georges Louis Leclere de Buffon,1707—1788)提出用投针实验的方法求圆周率π。这被认为是蒙特卡罗方法的起源。

想了解更多内容的可以参考这里。

今天通过一个实际的应用来更加清晰地了解一下这个采样方法,就是求解圆周率Pi,这个网上也有很多的相关的实现,实现本身很简单没有什么难度,主要就是想通过实践熟悉方法,具体实现如下:

#!usr/bin/env python
# encoding:utf-8
from __future__ import division"""
__Author__:沂水寒城
功能: Python基于蒙特卡洛方法实现求解圆周率计算思想:
在边长为n的正方形里面绘制一个内切圆,此时正方形面积为:n*n,圆形面积为:pi*(n/2)*(n/2)=pi*n*n/4
理论计算来说:内切圆与正方形的面积比为:4/pi:1
用概率论的思想来解释的话:
随机往正方形区域里面点点的话,如果次数足够多,那么点落在圆形区域里面的概率与落在正方形区域里面的概率比为:4/pi:1
"""import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circledef MTKL(num=100000,n=100,pic_path='1000.png'):'''蒙特卡洛方法num:点的数量n:正方形边长'''r=n/2#从正方形左下角定点开始顺时针得到四个顶点的坐标x1,y1=0,0x2,y2=0,nx3,y3,=n,nx4,y4=n,0#圆心坐标xr,xy=int((x1+x4)/2),int((y1+y2)/2)print 'xr: ',xr#绘制正方形区域fig=plt.figure()ax=fig.add_subplot(111)plt.plot([x1,y1],[x2,y2],color='g')plt.plot([x2,y2],[x3,y3],color='g')plt.plot([x3,y3],[x4,y4],color='g')plt.plot([x4,y4],[x1,y1],color='g')#随机丢点posX=np.random.uniform(0,n,num)posY=np.random.uniform(0,n,num)#计算点到圆心的距离dis=np.sqrt((posX-xr)**2 + (posY-xy)**2)#统计落在圆内点的数目res=sum(np.where(dis<=r,1,0))#计算pi的近似值(Monte Carlo:用统计值去近似真实值)pi=4*res/numplt.plot(posX,posY,'bo',markersize=0.4)plt.axis('equal') #防止图像变形circle=Circle(xy=(xr,xy),radius=r,alpha=0.5)ax.add_patch(circle)plt.title('PI: '+str(pi))plt.savefig(pic_path)plt.show()if __name__=='__main__':MTKL(num=10,n=100,pic_path='10.png')MTKL(num=100,n=100,pic_path='100.png')MTKL(num=1000,n=100,pic_path='1000.png')MTKL(num=10000,n=100,pic_path='10000.png')MTKL(num=100000,n=100,pic_path='100000.png')MTKL(num=1000000,n=100,pic_path='1000000.png')MTKL(num=10000000,n=100,pic_path='10000000.png')

整体的代码很简单,详细的注释也都添加了,我们实验了不同的次数来观察圆周率求解的精度,理论上来说:随着实验次数的增加,精度会越来越准确,下面简单看一下结果:

num=10

num=100

num=1000

num=10000

num=100000

num=1000000

num=10000000

我们设置的实验从10个点到1千万个点,可以直观地看到:随着点数量的增加,圆周率Pi的计算精度也随之升高。

Python实现蒙特卡罗方法仿真模拟求解圆周率Pi值相关推荐

  1. python中的圆周率怎么表示_如何采用Python语言求解圆周率的π值

    蒙特卡洛方法提供了一个利用计算机中随机数和随试验解决现实中无法通过公式求解问题的思路,本实例,通过采用蒙的卡罗方法采用Python语言来实现求解圆周率π的值 工具/原料 Python元件包 win7系 ...

  2. [Julia语言]使用Chudnovsky 算法快速计算圆周率 Pi (π) 值

    测试用的电脑是一台10年老电脑,CPU型号:E3 1230V2,3.3GHZ,4核8线程,8GB内存. 用下面的Julia程序,计算1万位的Pi值,耗时为0.26秒. 作为比较,用Julia实现的另一 ...

  3. [JuliaDelphi]快速计算圆周率 Pi (π) 值

    算法参考自: 计算圆周率Pi(π)值,精确到小数点后10000位 - 圆周率10000位 - C++ 爱好者 分别以Julia 1.72和Delphi 10.3写的算法如下面所示.在一台10年的老电脑 ...

  4. 【Python】蒙特卡罗方法计算圆周率及给定随机数种子

    蒙特卡罗方法 利用随机点分布,让随机点足够的多,用指定区域随机点数与总区域随机点数做比值来求取指定区域面积 求解圆周率,在一个正方形中撒点,根据在1/4圆内点的数量占总撒点数的比例计算圆周率值. 代码 ...

  5. python:蒙特卡罗方法计算圆周率

    求解圆周率可以采用蒙特卡罗方法,在一个正方形中撒点,根据在1/4圆内点的数量占总撒点数的比例计算圆周率值.‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭ ...

  6. Python用蒙特卡罗方法计算圆周率近似值

    实验目的: 1.理解蒙特Ÿ卡罗方法原理. 2.理解for循环本质与工作原理. 3.了解random模块中常用函数. 实验内容: 蒙特Ÿ卡罗方法是一种通过概率来得到问题近似解的方法,在很多领域都有重要的 ...

  7. 基于Python的蒙特卡罗方法估计Pi值的实现

    蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法.是 ...

  8. 求解圆周率PI的近似值

    题目描述如下: 用公式π/4≈1-1/3+1/5-1/7+...求圆周率PI的近似值,直到发现某一项的绝对值小于10^(-6)为止(该项不累加). 要求输出的结果总宽度占10位,其中小数部分为8位. ...

  9. 基于OpenCV的圆周率PI值的估计

    好久没有写博客了,今天有空写一下自己做的一个小实验,有兴趣的伙伴一起验证一下.刚刚开始学习计算机视觉,OpenCV没有基础,刚刚接触这门语言,就做几个小实验练习一下. 好了,废话不多说,进入正题.吾理 ...

  10. c语言计算pi后1000位,计算圆周率 Pi (π)值, 精确到小数点后 10000 位

    大家都知道π=3.1415926--无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题.现在有了电脑, 这个问题就简单了. 电脑可以利用级数计算出很多高精度的值, 有关级数的问题请 ...

最新文章

  1. EDM数据营销概念简要介绍
  2. 计算机视觉OpenCV之人脸识别的示例(Python)
  3. java78条注意事项
  4. input.touch拖动物体
  5. 大数据WEB阶段(四)JavaScript
  6. Bzoj1051 受欢迎的牛
  7. java导出服务器已经配置好的excel模板
  8. map python2 python3 兼容,Python2与Python3兼容
  9. java 向后台传两个json数据类型_前台向后台传递JSON字符串,处理JSON字符串类型的方法...
  10. App Store打了这么多年,ASO优化还剩什么?
  11. stm32h743单片机嵌入式学习笔记8-avi视频解码
  12. 高通发布骁龙845详细解读!
  13. 搭建CTF-AWD训练平台
  14. 怎样合理使用键盘以及键盘的保养方法
  15. 粘贴应变片步骤及注意事项
  16. 计算机多媒体课程教师教学心得,简易多媒体环境的教学功能心得体会
  17. java的splititeration,Java Spliterator.estimateSize方法代碼示例
  18. 关于计算机全景图的试题,计算机视觉实战篇—全景图制作
  19. 微信小程序中遇到的多规格问题(一)
  20. android8.1美化,QQ主题美化助手

热门文章

  1. i.MX6 设备树 GPIO 默认值
  2. Oracle10g 如何给scott用户解锁
  3. IDC:第三季度企业WLAN市场增长强劲
  4. unittest框架(惨不忍睹低配版)
  5. MyEclipse 使用文档
  6. python实现文件批量添加重命名
  7. springcloud(第三篇)springcloud eureka 服务注册与发现 *****
  8. ansibe tower的开源替代品semaphore
  9. 分组数据筛选(group by后取出每组的第n条数据)
  10. 内容编辑器在MOSS中的应用