0-故事:

  蒙特卡罗方法是计算模拟的基础,其名字来源于世界著名的赌城——摩纳哥的蒙特卡罗。

  蒙特卡罗一词来源于意大利语,是为了纪念王子摩纳哥查理三世。蒙特卡罗(MonteCarlo)虽然是个赌城,但很小,估计跟北京的一条街差不多大。

  其思想来源于著名的蒲丰投针问题(提出用投针实验的方法求圆周率π)。而后20世纪40年代美国在第二次世界大战中研制原子弹的“曼哈顿计划”计划的成员S.M.乌拉姆和J.冯·诺伊曼(计算机之父)首先提出了这一方法。

蒲丰投针:

  1777年法国科学家蒲丰提出了下述著名问题:平面上画有等距离 a(a>0) 的一些平行线,取一根长度为 l(l>0) 的针,随机地向有平行线的平面上掷去,求针与平行线相交的概率。

  我们用几何概型来解决这一问题。设 为针落下后的中点, x 表示中点M到最近一条平行线的距离, φ 表示针与平行线的交角。

  

  那么基本时间区域为一个面积为aπ/2的矩形:

  

  如果要想使针与平行线相交,则要满足:

  

  A的面积为:

  这样针与平行线相交的概率为:

  设一共投掷 n 次( n 是一个事先选好的相当大的自然数),观察到针和直线相交的次数为 m

  从上式我们看到,当比值 l/a不变时,p 值始终不变。取 m/np 的近似值,我们可以算出 π 的近似值。可以想象当投掷次数越来越多时计算的结果就越来越准确。

  

  传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法(MCM)由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。这也是以概率论和数理统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城-蒙特卡罗命名。该命名既反映了该方法的部分内涵,又便于记忆,因此得到人们的普遍接受。

  MCM发展历程:

  ①公元20世纪初期,尽管实验次数数以千计,利用蒙特卡罗方法所得到的圆周率π值,还是达不到公元5世纪祖冲之的推算精度。这可能是传统蒙特卡罗方法长期得不到推广的主要原因。

  ②计算机技术的发展,使得蒙特卡罗方法在最近10年得到快速的普及。现代的蒙特卡罗方法,已经不必亲自动手做实验,而是借助计算机的高速运转能力,使得原本费时费力的实验过程,变成了快速和轻而易举的事情。它不但用于解决许多复杂的科学方面的问题,也被项目管理人员经常使用。

MCM的优点有:

算法简单,省却了繁复的数学推导和演算过程,使得一般人也能够理解和掌握。

适应性强,问题的几何形状的复杂性对它的影响不大。

速度快,该方法的收敛性是指概率意义下的收敛,因此问题维数的增加不会影响它的收敛速度。

存贮少,处理大型复杂问题时的存贮单元很省。

1-MCM的定义:

  蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。在实际应用中会遇到一些问题,不论采用确定性算法或随机化算法,都无法保证每次得到正确的解,而使用蒙特卡罗算法在一般情况下可以保证,对问题的所有实例都以高概率给出正确解,但通常无法判定一个具体的解是否正确。Monte Carlo Method是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。与它对应的是确定性算法。

2-MCM的思想:

  设p是实数,且1/2 < p < 1。如果一个MCM算法对于问题的任一实例得到正确解的概率不小于p,则称该蒙特卡罗算法是p正确的。

  (MCM有一致性:对于同一实例,蒙特卡罗方法不会给出两个不同的正确解答)

  对于一致的p正确Monte Carlo Method,要提高正确解的概率,只要执行该算法若干次,并选择出现频次最高的解即可。

3-MCM的原理:

  由概率定义知,某事件的概率可以用大量试验中该事件发生的频率来估算,当样本容量足够大时,可认为该事件的发生频率即为其概率。因此,先对影响其可靠度的随机变量进行大量的随机抽样,然后把这些抽样值一组一组地代入功能函数式,确定结构是否失效,最后从中求得结构的失效概率。MCM正是基于此思路进行分析的。

  设有统计独立的随机变量 Xi(i = 1,2,3,…,k),其对应的概率密度函数分别为f(x1),f(x2),…,f(xk),功能函数式为Z=g(x1,x2,…,xk)。

  首先根据各随机变量的相应分布,产生N组随机数x1,x2,…,xk值,计算功能函数值Zi = g(x1,x2,…,xk) (i = 1,2,…,N),若其中有L组随机数对应的功能函数值 Zi≤0,则当N→∞ 时,根据伯努利大数定理正态随机变量的特性有:结构失效概率,可靠指标。

  从MCM的思路可看出,MCM可以回避结构可靠度分析中的数学困难,不管状态函数是否非线性、随机变量是否非正态,只要模拟的次数足够多,就可得到一个比较精确的失效概率和可靠度指标。特别当变异系数较大时,与JC法计算的可靠指标相比,结果更为精确,并且由于思路简单易于编制程序

  JC法,即当量正态化法,是将非正态分布的随机变量转化成对应的正态分布间接求解的方法。

4-使用前提:

  当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。

5-基本步骤:

 (1)构造或描述概率过程

对于本身就具有随机性质的问题,如粒子输运问题,主要是正确描述和模拟这个概率过程;对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为的概率过程,它的某些参量正好是所要求问题的解。即要将不具有随机性质的问题转化为随机性质的问题

(2)实现从已知概率分布抽样

构造了概率模型以后,由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量(或随机向量),就成为实现蒙特卡罗方法模拟实验的基本手段,这也是蒙特卡罗方法被称为随机抽样的原因。最简单、最基本、最重要的一个概率分布是(0,1)上的均匀分布(随机数就是具有这种均匀分布的随机变量),随机数序列就是具有这种分布的总体的一个简单子样,也就是一个具有这种分布的相互独立的随机变数序列。产生随机数的问题,就是从这个分布的抽样问题。在计算机上,可以用物理方法产生随机数,但价格昂贵,不能重复,使用不便。另一种方法是用数学递推公式产生。这样产生的序列,与真正的随机数序列不同,所以称为伪随机数,或伪随机数序列。不过,经过多种统计检验表明,它与真正的随机数,或随机数序列具有相近的性质,因此可把它作为真正的随机数来使用。由已知分布随机抽样有各种方法,与从(0,1)上均匀分布抽样不同,这些方法都是借助于随机序列来实现的,也就是说,都是以产生随机数为前提的。由此可见,随机数是实现蒙特卡罗模拟的基本工具

(3)建立各种估计量

一般说来,构造了概率模型并能从中抽样后,即实现模拟实验后,我们就要确定一个随机变量,作为所要求的问题的解,我们称它为无偏估计。建立各种估计量,相当于对模拟实验的结果进行考察和登记,从中得到问题的解。

  蒙特卡罗方法主要用在难以定量分析的概率模型,这种模型一般得不到解析的结果,或虽然有解析结果,但计算代价太大以至不可用。也可以用在算不出解析结果的定性模型中。

  用蒙特卡罗方法解题,需要根据随机变量遵循的分布规律选出具体的至,即抽样。随机变量的抽样方法很多,不同的分布采用的方法不尽相同。在计算机上的各种分布的随机数事实上都是按照一定的确定性方法产生的伪随机数。

6-MCM应用:

  通常蒙特·卡罗方法通过构造符合一定规则的随机数来解决数学上的各种问题。对于那些由于计算过于复杂而难以得到解析解或者根本没有解析解的问题,蒙特·卡罗方法是一种有效的求出数值解的方法。

  一般蒙特·卡罗方法在数学中最常见的应用就是蒙特·卡罗积分。

例子:非线性整数规划蒙特卡罗法的求解

  已知非线性整数规划为

  

7-主元素问题:

8-素数测试:

  一些背景资料和知识点摘自极客网、《数学建模 第2版》和《计算机算法设计与分析》

Monte Carlo Method(蒙特·卡罗方法)的更多相关文章

  1. 蒙特·卡罗方法(Monte Carlo method)

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

  2. (转)Monte Carlo method 蒙特卡洛方法

    转载自:维基百科  蒙特卡洛方法 https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%9 ...

  3. Summary: How to calculate PI? Based on Monte Carlo method

    refer to: http://www.stealthcopter.com/blog/2009/09/python-calculating-pi-using-random-numbers/ Duri ...

  4. 蒙特卡罗算法(Monte Carlo method)

    蒙特卡罗方法概述 蒙特卡罗方法又称统计模拟法.随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法.将所求解的问题同一 ...

  5. 蒙特卡罗(Monte Carlo)方法简介

    蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数"的计算方法. 二 解决问题的基本思路 Monte Carlo方法的基本思想很早以前就被人们所发 ...

  6. 蒙特卡罗方法、蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS)初探

    1. 蒙特卡罗方法(Monte Carlo method) 0x1:从布丰投针实验说起 - 只要实验次数够多,我就能直到上帝的意图 18世纪,布丰提出以下问题:设我们有一个以平行且等距木纹铺成的地板( ...

  7. Python & Matplotlib: Monte Carlos Method

    Hey! 这里是Lindy:) Hope you guys are doing well! 今天想记录的概念叫做 蒙特·卡罗 方法,是今年在cs课上老师做的扩展延伸.其实我在初次接触这个概念时觉得很新 ...

  8. Monte carlo

    转载 http://blog.sciencenet.cn/blog-324394-292355.html 蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数 ...

  9. Monte Carlo Approximations

    准备总结几篇关于 Markov Chain Monte Carlo 的笔记. 本系列笔记主要译自A Gentle Introduction to Markov Chain Monte Carlo (M ...

随机推荐

  1. sql server 生成数据库字典 sql语句

    SELECT TOP 100 PERCENT --a.id,          CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,      ...

  2. 【转】JavaSE面试题目收集

    1.是否可以从一个static方法内部发出对非static方法的调用? 不可以.当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用, ...

  3. 大华门禁SDK二次开发(一)-技术沟通

    项目中需要能够查询门禁信号和控制门禁设备,因此需要基于大华门禁SDK进行二次开发,开发语言C#.门禁开发中遇到了一些问题,经过与大华技术的邮件沟通也一一解决.做这个开发的时候,发现网上的资料比较少,想 ...

  4. C# 通过KD树进行距离最近点的查找.

    本文首先介绍Kd-Tree的构造方法,然后介绍Kd-Tree的搜索流程及代码实现,最后给出本人利用C#语言实现的二维KD树代码.这也是我自己动手实现的第一个树形的数据结构.理解上难免会有偏差,敬请各位 ...

  5. 一种解决Android studio 3.0 Build报错的方法

    问题背景: 最近在开始使用AndroidStudio3.0,刚好有一个开源的项目(Material-Movies),需要学习下.因为该项目比较早(2015年),而这段时间AndroidStudio和G ...

  6. Netty 核心容器之ByteBuf 结构详解

    原文链接 Netty 核心容器之ByteBuf 结构详解 代码仓库地址 Java的NIO模块提供了ByteBuffer作为其字节存储容器,但是这个类的使用过于复杂,因此Netty实现了ByteBuf来 ...

  7. ThinkPad 安装 Ubuntu 18.10 系统 -- 高分屏各项配置与Nvdia独显驱动

    索引: 目录索引 一.机器概述 1.屏幕:14'' 2.分辨率:1920*1080 3.显卡:Intel 核显  &  Nvidia  GeForce 940MX 独显 ,双显卡 4.其它硬件 ...

  8. C++设计模式视频讲解

    设计模式(C++) 视频网址: http://www.qghkt.com/ 设计模式(C++)视频地址: https://ke.qq.com/course/318637?tuin=a508ea62 目 ...

  9. Redis中5种数据结构的使用场景

    一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 ...

  10. 关于mysql的报错的1366

    报错的的代码: Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column ...