一、背景

  蒙特卡罗模拟方法 (Monte Carlo simulation) 诞生于上个世纪40年代美国的”曼哈顿计划”,名字来源于赌城蒙特卡罗。蒙特卡罗算法从某种意义上而言,就是一种赌博算法。
  它是一种基于随机试验和统计计算的数值方法,也称计算机随机模拟方法或统计模拟方法。蒙特卡罗方法的数学基础是概率论中的大数定律和中心极限定理。

二、算法引入

  最早接触到这类算法应该是在高中或者初中阶段,而且是一道送分题。即在一个正方形中有一个内接圆。现在在这个正方形内抛洒豆子。已知正方形面积为S,落在正方形内的豆子总数为 M M M,其中落在内接圆内的豆子总数为 N" role="presentation">NNN。请估算内接圆的面积。

  根据概率论中的大数定律可知,当随机事件发生的次数足够多的时候(趋向于正无穷),其发生频率就可作为此事件发生的概率。对于本题,当抛洒的豆子足够多的时候,落在圆中的豆子比值即可视为圆与正方形面积的比值。那么计算结果 S×N/M S × N / M S× N/M 即为圆形面积。
  这种算法需要承担一定的风险,但是比起这种算法带给我们的收益,风险其实不足为惧,同时我们也可以运用合理恰当的方式来最小化这种风险。
  在建模和仿真中,应用蒙特卡罗方法主要有两部分工作:用蒙特卡罗方法模拟某一过程时,产生所需要的各种概率分布的随机变量;用统计方法把模型的数字特征估计出来,从而得到问题的数值解,即仿真结果。

解题步骤如下:
  1、根据提出的问题构造一个简单、适用的概率模型或随机模型,使问题的解对应于该模型中随机变量的某些特征(如概率、均值和方差等),所构造的模型在主要特征参量方面要与实际问题或系统相一致。
  2、根据模型中各个随机变量的分布,在计算机上产生随机数,实现一次模拟过程所需的足够数量的随机数。通常先产生均匀分布的随机数,然后生成服从某一分布的随机数,方可进行随机模拟试验。
  3、根据概率模型的特点和随机变量的分布特性,设计和选取合适的抽样方法,并对每个随机变量进行抽样(包括直接抽样、分层抽样、相关抽样、重要抽样等)。
  4、按照所建立的模型进行仿真试验、计算,求出问题的随机解。
  5、统计分析模拟试验结果,给出问题的概率解以及解的精度估计。

三、算法应用

  蒙特卡罗算法的应用领域很多,这个算法在金融学、经济学、工程学等领域得到了广泛应用。适用于 Monte−Carlo M o n t e − C a r l o Monte-Carlo 算法的问题,比较常见的有两类。一类是问题的解等价于某事件的概率,如算法引入中提到的求解圆的面积问题。另一类是判定问题,即判定某个命题是否为真,例如主元素存在性判定和素数的测试问题。
  对于第一类算法所涉及到的问题,最多的就是定积分的求解。通常情况下我们有公式来求解各种图形的面积,当然也可以求解定积分。但是当我们遇到不规则图形以及极为复杂难以求解的定积分时,由于定积分的直观意义就是函数曲线与 x x x 轴围成的图形中,y&gt;0" role="presentation">y>0y>0y>0 的面积减去 y<0 y < 0 y 的面积。同样是对于不规则面积的求解,最终我们都可以回到蒙特卡罗算法中来求解面积。

  对于蒙特卡罗算法,其优缺点也是比较明显的:
优点:
  1、能够比较逼真的描述具有随机性质的事物的特点及物理实验过程
  2、受几何条件限制小
  3、收敛速度与问题的维数无关
  4、误差容易确定
  5、程序结构简单,易于实现
缺点:
  1、收敛速度慢
  2、误差具有概率性
  3、进行模拟的前提是各输入变量是相互独立的

四、算法实例

例1:

  在不知道求解圆面积的公式的情况下,试用蒙特卡罗法求出圆面积。

解答:
  由上文介绍可知,可在matlab中生成大量在 [0;2] [ 0 ; 2 ] [0;2] 上服从均匀分布的随机数,从而模拟上文中的抛撒豆子。通过计算落在圆中的点与总点数,就可算出圆与正方形面积之比。

%Monte-Carlo
sita = 0:0.01:2*pi;
x = sin(sita);
y = cos(sita);%计算半径为1的圆周上的点,以便做出观察
m = 0;%计数器
x1 = 2*rand(1000,1) - 1;
y1 = 2*rand(1000,1) - 1;
N = 1000;%设置实验次数
for n = 1:Np1 = x1(1:n);q1 = y1(1:n);if (x1(n) * x1(n) + y1(n) * y1(n)) < 1m = m + 1;endplot(p1,q1,'.',x,y,'-k',[-1 -1 1 1 -1],[-1 1 1 -1 -1],'-k');axis equal;axis([-2 2 -2 2]);text(-1,-1.2,['实验总次数 n=',num2str(n)]); %显示实验结果text(-1,-1.4,['落入圆中数 m=',num2str(m)]);text(-1,-1.6,['近似圆面积 S_c=',num2str(m/n*4)]);set(gcf,'DoubleBuffer','on'); %双缓冲避免作图闪烁drawnow; %显示结果
end

为了提升程序效率,可以取消仿真过程中间的可视化显示,并且利用 Matlab M a t l a b Matlab 的矩阵运算来改造程序。
修改后代码如下:


ti                          % 计时器启动
n=10000;                    % 每次随机落点10000个
for k=1:1000                % 重复试验1000次x1=2*rand(n,1)-1;y1=2*rand(n,1)-1;       % 随机落点产生m(k)=sum((x1.*x1+y1.*y1)<1);% 求落入圆中的点数和
end
S_c=mean(m).*4./n           % 计算并显示结果
time=toc                    % 显示耗时

此例题方法可扩展到求解不规则图形面积等问题上。求解所得结果会有很小的偏差,当生成的随机点数足够多时,此误差可忽略不计。

例2:
  用蒙特卡洛法求解积分 ∫6013xdx ∫ 0 6 1 3 x d x \int_0^6 \frac 1 3xdx 。

求解:

clear
clc
n=10000;
tol=[];
for i=1:10000x1=6*rand(n,1);y1=2*rand(n,1);tol(i)=sum(x1.*(1/3)>y1);
end
S=mean(tol).*12./n;

  口算该积分值可得答案为6。如果用蒙特卡罗算法计算,撒10000个点可得到值为6.0007,误差仅为0.0007,相对于6这个结果已经可以忽略不计。
  该代码中每次计算撒了10000个点。蒙特卡罗算法得到的解的准确率会随着撒点次数的增大而提升,这是蒙特卡罗算法的优点同时也是它的弊端。当仿真情形过于复杂时,若要得到一个比较精确的结果,大量的模拟次数会使程序运行时间过长。所以何时使用蒙特卡罗算法要从多方面考虑,蒙特卡罗算法在硬件配置的约束下,并不是一种万能解法。

  当然数学建模比赛中并不大可能直接要你求解某个不规则图形的面积。很多的算法理解起来或者运用起来并不难,多数难点在于,队员能否发现某个问题与某种算法是契合的。也就是能否让人发出“我X,这个算法还能这样用啊!”的感叹。蒙特卡罗算法也是一样。

  灵活运用蒙特卡罗算法的一个比较经典的例子就是2010年国赛A题的储油罐问题了。有兴趣的朋友可以自行查找原题,这里不对题目再做赘述。
  以下是网上一篇优秀论文在该题中利用蒙特卡罗法解题的方式。

六 模型的检验与评价
6.1 模型的检验(蒙特卡洛模拟方法)
  在实际储油罐罐容表模型的建立和求解过程中,我们对球冠体内倾斜的部分燃油的体积进行了近似计算,忽略了一小部分球冠体体积。鉴于此,我们考虑通过用计算机模拟对该部分的体积进行模拟计算,观察近似计算值与精确模拟数值的吻合情况,同时也对我们建立的模型进行验证。
  模拟过程中的主要步骤:

Step1: 划分空间,确定被忽略区域 Q Q Q 的空间限制范围,建立空间限制函数表达式。并寻求一包含该区域 Q" role="presentation">QQQ 的最小长方体。建立坐标系,确定 Q Q Q 所在的区域范围;
Step2: 均匀做点,在长方体内分别从 x,y,z" role="presentation">x,y,zx,y,zx,y,z 三个坐标轴依次等间距的产点 pi(xi,yi,zi) p i ( x i , y i , z i ) p_i (x_i, y_i, z_i) ,记录落入该区域的点以及生成的点的总数 M M M ,计算该长方体区域的总体积V" role="presentation">VVV ;
Step3: 统计落在该区域的点的个数,求该部分体积 VQ V Q V_Q ,计算公式为:

VQ=mM∗V V Q = m M ∗ V

V_Q =\frac m M* V

  在模拟中对不同区域分别进行求解所忽略部分的体积 VQ V Q V_Q ,再与所得到的理论值相加可得实际测量的精确值。根据蒙特卡洛模拟得到的被省略部分的体积,我们可以画出实际体积和近似体积的差别图。

  该论文非常巧妙的将蒙特卡罗算法用于模型的检验而不是用于模型的求解,灵活的利用了蒙特卡罗算法的特性,得到了较优的结果。

五、算法扩展——拉斯维加斯算法

  蒙特卡罗是一类随机方法的统称。这类方法的特点是,可以在随机采样上计算得到近似结果,随着采样的增多,得到的结果是正确结果的概率逐渐加大,但在(放弃随机采样,而采用类似全采样这样的确定性方法)获得真正的结果之前,无法知道目前得到的结果是不是真正的结果。
  拉斯维加斯方法是另一类随机方法的统称。这类方法的特点是,随着采样次数的增多,得到的正确结果的概率逐渐加大,如果随机采样过程中已经找到了正确结果,该方法可以判别并报告,但在但在放弃随机采样,而采用类似全采样这样的确定性方法之前,不保证能找到任何结果(包括近似结果)。
  有兴趣的同学可以查找资料进行深入了解。

本文参考了以下链接的文章:
http://blog.sina.com.cn/s/blog_5396207a0102wgkc.html
蒙特卡罗算法关联的拉斯维加斯算法引用
http://www.ruanyifeng.com/blog/2015/07/monte-carlo-method.html
关于蒙特卡罗算法的部分实例
http://www.360doc.com/content/11/0518/19/991597_117736089.shtml
关于蒙特卡罗算法更多应用实践参考

2-8、蒙特卡洛模拟相关推荐

  1. matlab腔内光子寿命,mcFORnp matlab环境下,利用蒙特卡洛模拟光子包在生物组织内的光路传输 271万源代码下载- www.pudn.com...

    文件名称: mcFORnp下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 215 KB 上传时间: 2014-12-29 下载次数: 8 提 供 者: 徐某 ...

  2. 评估数据源是否回溯_IAI Trade:蒙特卡洛模拟在回溯检验中的应用

    IAI Trade致力于降低量化交易门槛,在IAI Trade用户可以使用"可视化策略生成器"0代码生成EA策略,并一键接通模拟交易及真实交易. 蒙特卡洛模拟和回溯检验 考虑一个随 ...

  3. 蒙特卡洛模拟_蒙特卡洛模拟法求期权价值

    今年跟朋友讨论了一个期权问题. "Earn Out"方式并购下的金融工具确认. 大致条款如下(非真实情况): 收购一家标的企业估值15000万元.盈利预测情况如下: 收购协议中约定 ...

  4. 计算机软件及应用stata,蒙特卡洛模拟及其Stata应用实现

    蒙特卡洛模拟及其Stata应用实现 出版时间:2015年版 丛编项:海南大学经济管理系列丛书 内容简介 <蒙特卡洛模拟及其Stata应用实现>的第1章是Stata软件基础,主要介绍了Sta ...

  5. Python中表示偶数_蒙特卡洛模拟(Python)深入教程

    译者:大表哥.wiige来源:AI研习社 什么是蒙特卡罗模拟? 蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的技术.蒙特卡罗模拟或概率模拟是一种技术,用于了解金融部门.项目管理.成本和其他预测机器 ...

  6. 蒙特卡洛模拟预测股票_使用蒙特卡洛模拟来预测极端天气事件

    蒙特卡洛模拟预测股票 In a previous article, I outlined the limitations of conventional time series models such ...

  7. python 蒙特卡罗_蒙特卡洛模拟(Python)深入教程

    原标题:蒙特卡洛模拟(Python)深入教程 字幕组双语原文:蒙特卡洛模拟(Python)深入教程 英语原文:Monte Carlo Simulation An In-depth Tutorial w ...

  8. 蒙特卡洛模拟(Monte Carlo simulation)

    1.蒙特卡罗模拟简介 蒙特卡罗模拟,也叫统计模拟,这个术语是二战时期美国物理学家Metropolis执行曼哈顿计划的过程中提出来的,其基本思想很早以前就被人们所发现和利用.早在17世纪,人们就知道用事 ...

  9. 利用 MPI 进行蒙特卡洛模拟

    参考 MPI对道路车辆情况的Nagel-Schreckenberg 模型进行蒙特卡洛模拟 实验题目 题目: 利用 MPI 进行蒙特卡洛模拟 内容: 在道路交通规划上,需要对单条道路的拥堵情况进行估计. ...

  10. 蒙特卡洛模拟电动汽车充电matlab,基于蒙特卡洛模拟的电动汽车充电负荷预测

    基于蒙特卡洛模拟的电动汽车充电负荷预测 The Prediction of Electric Vehicles Charging Load Based on Monte Carlo Simulatio ...

最新文章

  1. shell介绍及基本用法
  2. 【Asp.Net】得到http请求中的参数语句
  3. 解决protobuf import路径的问题
  4. opt文件夹下没有ros_ubuntu16.04下ROS操作系统学习笔记(二)
  5. cpu真实占用率检測工具
  6. MyEclipse常用配置图解
  7. TypeScript入门教程 之 箭头函数
  8. 如何切换svn用户?
  9. Javascript:Ajax讲解
  10. java调用flex_转载:在JavaScript中调用Flex方法
  11. Java实现抓取百度识图结果的实现和思路-1-创造百度识图的URL链接
  12. pageHelper.startPage(m,n)的用法
  13. linux 系统重启过程,linux 系统启动流程
  14. 深度学习不得不知的英文名称
  15. 流量Ⅰ--一文了解pcap网络数据包的结构?
  16. 用 VR 看 NBA,你甚至可以被勒布朗·詹姆斯隔扣
  17. 我眼中的匈牙利命名法
  18. ScienceDirect打不开?试试这个方法
  19. 基于node的cmd迷你天气查询工具
  20. 电梯、保温杯、电脑、签到的测试用例

热门文章

  1. nginx的作用与原理
  2. 会计----会计凭证
  3. 直播预告 | NeurIPS 专场八
  4. 《心智社会》—马文·明斯基
  5. 80句励志名言名句-用来时刻鞭策自己
  6. 2021年度总结,一整年的精华所在!
  7. Linux技术(1)--CentOS 6.5关闭防火墙步骤
  8. HBase(一):概述
  9. 概念区别 【编译型语言与解释型语言、动态类型语言与静态类型语言、强类型语言与弱类型语言】
  10. R语言的数据读入--非结构化数据读入