蒙特卡洛算法及其实现
从今天开始要研究Sampling Methods,主要是MCMC算法。本文是开篇文章,先来了解蒙特卡洛算法。
Contents
1. 蒙特卡洛介绍
2. 蒙特卡洛的应用
3. 蒙特卡洛积分
1. 蒙特卡洛介绍
蒙特卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的
发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使
用随机数(或伪随机数)来解决很多计算问题的方法。与它对应的是确定性算法。蒙特卡罗方法在金融工程
学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域应用广泛。
蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的“曼哈顿计划”计划的成员S.M.乌拉姆
和J.冯·诺伊曼首先提出。数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,
为它蒙上了一层神秘色彩。在这之前,蒙特卡罗方法就已经存在。1777年,法国数学家布丰提出用投针实验
的方法求圆周率,这被认为是蒙特卡罗方法的起源。
另外,拟蒙特卡洛算法在近几年也获得迅速发展。这种方法是用确定性的超均匀分布代替蒙特卡洛算法中的
随机数序列,对于某些特定问题计算速度比普通的蒙特卡洛算法高几百倍。
由于产生随机数的随机性,当我们用N个随机点以蒙特卡罗方法来求解具体的问题时,其计算得到近似解的误
差值有大有小,但是肯定有一个确定的平均值,即一些误差大于此值,而其余误差小于此值。鉴于此,显然肯
定存在这样的N个点,使得误差的绝对值不大于平均值。如果我们能够构造这样的点集,就可以对原有的方法
进行较大的改进。拟蒙特卡罗方法就是至于此而提出的,它致力于构造其误差比平均误差显著要好的那种点集,
而其求解形式与蒙特卡罗方法一致,只不过所用的随机数不一样。用蒙特卡罗方法求解问题时,影响结果好坏
的主要是随机数序列的均匀性。而拟蒙特卡罗方法中的具有低偏差的一致分布点集较伪随机数序列更为均匀,
而且用拟蒙特卡罗方法求解得到的是真正的误差,避免了蒙特卡罗方法得到概率误差的缺陷。
由此可见用拟蒙特卡罗方法求解问题的关键是如何找到一个均匀散布的点集。目前常用的点集有GLP点集(好格
子点集,good lattice point set)、GP点集(好点集,good point set)、Halton点集及其变体、
Hammersley点集等。
蒙特卡洛方法的理论基础是大数定律。大数定律是描述相当多次数重复试验的结果的定律,根据这个定律知道
样本数量越多,其平均就越趋近于真实值。
2. 蒙特卡洛的应用
最经典的应用就是利用蒙特卡洛算法求圆周率。代码如下
代码:
1 #include <bits/stdc++.h> 2 3 #define MAX_ITERS 1000000 4 5 using namespace std; 6 7 double Rand(double L, double R) 8 { 9 return L + (R - L) * rand() * 1.0 / RAND_MAX; 10 } 11 12 double GetPi() 13 { 14 srand(time(NULL)); 15 int cnt = 0; 16 for(int i = 0; i < MAX_ITERS; i++) 17 { 18 double x = Rand(-1, 1); 19 double y = Rand(-1, 1); 20 if(x * x + y * y <= 1) 21 cnt++; 22 } 23 return cnt * 4.0 / MAX_ITERS; 24 } 25 26 int main() 27 { 28 for(int i = 0; i < 10; i++) 29 cout << GetPi() << endl; 30 return 0; 31 }
3. 蒙特卡洛积分
关于蒙特卡洛求积分,可以先参照如下文章。
链接:http://cos.name/2010/03/monte-carlo-method-to-compute-integration/
接下来用蒙特卡洛积分求自然常数。这是2015年阿里的一道笔试题。
首先考虑如下积分
接下来分别用蒙特卡洛积分和牛顿莱布尼兹公式计算,在蒙特卡洛方法中样本很多时,它们的值应该相等。
利用蒙特卡洛方法,图像大致如下
上述积分的目的是求阴影部分的面积,所以先在所标矩形内取对随机点,
对于每一对,考察是否满足如下条件
假设满足上述条件的点有个,而全部的点有个,所以得到近似公式为
而依据牛顿莱布尼兹公式可以得到
这两种方法结果应该是相等的,即有
接下来写写代码吧!
代码:
1 #include <bits/stdc++.h> 2 3 #define MAX_ITERS 10000000 4 5 using namespace std; 6 7 struct Point 8 { 9 double x, y; 10 }; 11 12 double Rand(double L, double R) 13 { 14 return L + (R - L) * rand() * 1.0 / RAND_MAX; 15 } 16 17 Point getPoint() 18 { 19 Point t; 20 t.x = Rand(1.0, 2.0); 21 t.y = Rand(0.0, 1.0); 22 return t; 23 } 24 25 double getResult() 26 { 27 int m = 0; 28 int n = MAX_ITERS; 29 srand(time(NULL)); 30 for(int i = 0; i < n; i++) 31 { 32 Point t = getPoint(); 33 double res = t.x * t.y; 34 if(res <= 1.0) 35 m++; 36 } 37 return pow(2.0, 1.0 * n / m); 38 } 39 40 int main() 41 { 42 for(int i = 0; i < 20; i++) 43 cout << fixed << setprecision(6) << getResult() << endl; 44 return 0; 45 }
观察一下运行结果,效果还是不错的。如下图
蒙特卡洛算法及其实现相关推荐
- 马尔科夫链蒙特卡洛算法(python)
文章目录 1 蒙特卡洛算法 1.1 基本思想 1.2 蒙特卡洛积分 1.2.1 求π\piπ 1.2.2 求积分 1.2.2.1 一维积分 1.2.2.2 高维积分 1.3 蒙特卡洛期望估计 1.4 ...
- matlab碎纸拼接相似函数,基于蒙特卡洛算法构建能量函数的碎纸图片拼接方法
基于蒙特卡洛算法构建能量函数的碎纸图片拼接方法 [专利摘要]本发明提供了一种基于蒙特卡洛算法构建能量函数的碎纸图片拼接方法,主要涉及双面打印文件的拼接及复原问题,通常由于图片较多,信息量较大,故通常为 ...
- java中使用几率_Java中使用蒙特卡洛算法计算德州扑克成牌概率(二)- 计算牌面分值...
德州扑克中比较重要的一个算法就是计算牌面的得分,不仅仅关乎概率计算的结果,同时也需要很高的性能.蒙特卡洛算法计算的次数越多结果越准确,因此算法的性能至关重要.下面是一个高性能的牌面java计算算法. ...
- python实现蒙特卡洛算法_用Python实现基于蒙特卡洛算法小实验
用Python实现基于蒙特卡洛算法小实验 蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯· 诺伊曼 ,他在20世纪40年代中期用驰名世界的赌城- ...
- Metropolis 采样与蒙特卡洛算法
Metropolis 算法又叫 Metropolis 抽样,是模拟退火算法的基础,在早期的科学计算中蒙特卡洛方法(Monte Carlo)是对大量原子在给定温度下的平衡态的随机模拟,当蒙特卡洛算法计算 ...
- 从伪随机数的产生到高大上的蒙特卡洛算法(C语言实现)
一 准备 1 生成任意区间任意大小的伪随机数 2 什么是蒙特卡洛算法 二蒙特卡洛算法的实现 1 pi的蒙特卡洛计算方式 2 特殊图形的蒙特卡洛计算方式 通过这篇短文想说明两个道理: 看似高大上.神秘兮 ...
- python实验原理_Python实现蒙特卡洛算法小实验过程详解
蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...
- 蒙特卡洛算法简单理解与demo
所谓蒙特卡洛算法,实际上就是用频率估计概率. 首先我们知道一个边长为2的正方形面积是2*2=4,他的内接圆的面积是π*1,那么我们在这样一个正方形内随机生成10000个点,落在圆里的点的个数/1000 ...
- 蒙特卡洛算法及简单应用
基本概念 蒙特卡罗方法又称统计模拟法.随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或伪随机数)来解决很多计算问题的方法.将所求解的问题同一定的概率模型相联 ...
最新文章
- jenkins如何在一台机器上开启多个slave
- springMVC 处理json 及 HttpMessageConverter 接口
- 10 大常用软件架构模式简介
- 远程服务器如何创建分支,git如何远程创建分支
- PHP服务器端语言是什么意思,PHP作为服务器端语言,有哪些优点?
- WPF中嵌套charts图表查询数据
- 为什么中小企业选择 SAP Business One?
- php 调试 500,利用WordPress开发者调试模式解决PHP500内部服务器错误 | 骤雨打新荷...
- 如何发现隐藏的Webshell后门
- 《游戏设计艺术(第二版)》读书笔记
- 软件测试的标准操作流程
- 【直流潮流】基于直流潮流的电力系统停电分布及自组织临界性分析
- Cesium 视频融合,边缘模糊
- 南昌大学计算机考研2021,2021南昌大学考研参考书目
- 用matlab画标准雷电波,雷电波发生器的MATLAB仿真及参数选取sc.doc
- 用python(numpy)复现matlab代码
- linux命令宝典,Linux命令行完全技术宝典(张栋) PDF扫描版[85MB]
- Docker下安装MCR windows镜像安装Matlab 静默安装MCR silent install 无交互安装 无Gui安装 控制台安装
- c语言计算两个整数的乘积
- 【红米刷机】红米手机卡刷稳定版教程