基本概念

蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。

基本思想:

当所求问题的解是某个事件的概率,或者是某个随机变量的数学期望,或者是与概率,数学期望有关的量时,通过某种试验的方法,得出该事件发生的概率,或者该随机变量若干个具体观察值的算术平均值,通过它得到问题的解。
当随机变量的取值仅为1或0时,它的数学期望就是某个事件的概率。或者说,某种事件的概率也是随机变量(仅取值为1或0)的数学期望。

简单通俗点说,蒙特卡洛算法就是通过大量的随机模拟,在随机的数据里找到符合条件的数据,计算他的比例,从而推出解的近似值,比如,我要计算一个矩形里的不规则图形的面积,我可以通过在矩形里生成大量随机点,然后计算随机点在不规则图形里的概率,乘以矩形面积得出不规则图形的面积;

蒙特卡洛应用范围很广,解决的问题也很多很深,本文只针对蒙特卡洛算法在纯数学里的一些基本的简单的应用,实现语言:matlab

优点:

1、能够比较逼真地描述具有随机性质的事物的特点及物理实验过程
2、受几何条件限制小
3、收敛速度与问题的维数无关
4、具有同时计算多个方案与多个未知量的能力
5、误差容易确定
6、程序结构简单,易于实现

缺点:

1收敛速度慢
2误差具有概率性
3在粒子输运问题中,计算结果与系统大小有关

所以在使用蒙特卡罗方法时,要“扬长避短”,只对问题中难以用解析(或数值)方法处理的部分,使用蒙特卡罗方法计算,对那些能用解析(或数值)方法处理的部分,应当尽量使用解析方法

使用蒙特卡洛算法计算积分,积分大家应该都知道,其实他就是曲线与坐标轴的面积,可以用牛顿-莱布尼兹公式求解,基本初等函数我们会求他的积分,可是如果不是呢? 那我们可以直接从他的物理意义入手,用蒙特卡洛算法求面积得出积分的近似值;

在进行实例之前,先介绍下一个函数:引自:点击打开链接

unifrnd可以创建随机的连续均匀分布的数组。

1.R = unifrnd(A,B)

returns an array of random numbers chosen from the continuous uniform distribution on the interval from A to B. The size of R is the common size of A and B if both are arrays.  If either parameter is a scalar, the size of R is the size of the otherparameter.

这是matlab自带的帮助文件的解释,比较简略,以下补充本人的理解:

A和B可以是向量也可以是标量,若两个都是向量,则两者都是列向量或都是行向量,而且维数相等。从A到B产生一系列区间,若A和B均为向量,则区间个数等于他们的维数;若其中恰有一个是向量,假设A为向量,则区间个数等于A的维数;若两个均为标量,则A <= B,区间个数为1,且区间为[A,B]。然后在这一系列区间中随机产生连续均匀分布的数组R并返回之。具体例子下述。

例1.

执行指令

>> x = [1:9];
>> y = [2:10];
>> unifrnd(x,y)

得到

ans =

1.9595    2.6557    3.0357    4.8491    5.9340    6.6787    7.7577    8.7431    9.3922

从x到y产生区间[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9],[9.10].然后从每个区间产生一个随机数,得到R。

例2.

执行指令

>> x = [1:3];
>> R1 = unifrnd(x,1);
>> R2 = unifrnd(1,x);

得到

R1 =

1   NaN   NaN

R2 =

1.0000    1.2769    1.0923

NaN表示"not a number"即不是数字。观察语句R1 = unifrnd(x,1);“从x到1”产生区间[1,1],[2,1],[3,1]显然只有第一个区间可以取得“随机数”1,其余区间不符合规定,故而返回NaN。

观察R2 = unifrnd(1,x);从1到x产生区间[1,1],[1,2],[1,3],取得随机数组R2.

2.R = unifrnd(A,B,M,N,...) or R = unifrnd(A,B,[M,N,...]) 

returns an M-by-N-by-... array.

例1:计算

n = 5000;
>> unifrnd(0, 2, 1, n);
>> res = 2*mean(exp(ans))

这种写法就是利用牛顿-莱布尼兹的原理,随机n个不同数据x,计算出他们的f(x),然后计算出平均“高度”,再乘以底得出面积,随机的数据越多,他的精度相对越高

例2: 给定曲线y =2 – x2 和曲线y3 = x2,曲线的交点为:P1( – 1,1 )、P2( 1,1 )。曲线围成平面有限区域,用蒙特卡罗方法计算区域面积。

代码1:可以计算出面积,利用find函数找出符合条件的点

P=rand(10000,2);
x=2*P(:,1)-1;
y=2*P(:,2);
II=find(y<=2-x.^2&y.^3>=x.^2);  %找出x,y向量所有符合条件的位置,得出一个记录位置的向量II
M=length(II);   %计算一共几个点
S=4*M/10000   %用面积*概率得出近似概率
plot(x(II),y(II),'g.')  %利用符合条件的随机点得出图形

代码2:直接计算出有多少个符合条件的点,不必管哪些点

 n = 100000;
x = unifrnd(-1, 1, 1, n);
y = unifrnd(0, 2, 1, n);
num = sum(y <= 2-x.^2 & y.^3 >= x.^2); %直接计算出符合条件的点
S = num/n * 4

也可以算出两个方程的积分,然后相减

例3:计算体积

计算 其中D为y= x – 2与y2 = x 所围 
D的边界曲线交点为:(–1,1),(4,2),被积函数在求积区域内的最大值为16。积分值是三维体积,该三维图形位于立方体区域
0≤ x ≤4,–1≤ y ≤2,0 ≤ z ≤16
内,立方体区域的体积为192。

代码:

n = 10000;
x = unifrnd(0, 4, 1, n);
y = unifrnd(-1, 2, 1, n);
z = unifrnd(0, 16, 1, n);
II = find(x >= y.^2 & x <= y+2 & z <= x.*(y.^2));
num = length(II);
v = 192*num/n;
plot3(x, y, z, ' r.')

例4:处理非线性整数规划问题( 数学建模算法与应用(司守奎版)P15页模型)

随机1e7个点,来找出最优解。

function [f, g] = mengte(x)
f = x(1)^2 + x(2)^2 + 3*x(3)^2 + 4*x(4)^2 + 2*x(5)^2 - 8*x(1) - 2*x(2) -3*x(3) - x(4) - 2*x(5);
g = [sum(x)-400,x(1)+2.*x(2)+2.*x(3)+x(4)+6.*x(5)-800,2.*x(1)+x(2)+6.*x(3)-200,x(3)+x(4)+5.*x(5)-200];
%g=[sum(x)-400  x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800 2*x(1)+x(2)+6*x(3)-200 x(3)+x(4)+5*x(5)-200];
end
rand('state', sum(clock));
p0 = 0;
tic
x0 = [];
for i = 1 : 10^6
x = randi([0,99], 1, 5);
[f,g] = mengte(x);
if all(g <= 0)
if p0 < f
x0 = x; p0 = f;
end
end
end
x0,p0
toc

蒙特卡洛算法及简单应用相关推荐

  1. 蒙特卡洛算法简单理解与demo

    所谓蒙特卡洛算法,实际上就是用频率估计概率. 首先我们知道一个边长为2的正方形面积是2*2=4,他的内接圆的面积是π*1,那么我们在这样一个正方形内随机生成10000个点,落在圆里的点的个数/1000 ...

  2. 基于Python的简单蒙特卡洛算法

    首先介绍一下蒙特卡洛算法,蒙特卡洛算法是一种基于随机抽样的计算方法,主要用于模拟和计算复杂的系统和问题.它的名称来自于蒙特卡洛赌场,因为它使用了类似于赌博的随机性质来解决问题. 蒙特卡洛算法的基本思想 ...

  3. 简单理解蒙特卡洛算法

    1.概述 蒙特卡洛算法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法.是指使用随机数来解决很多计算问题的方法.利用若干个随 ...

  4. 马尔科夫链蒙特卡洛算法(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 ...

  5. python实现蒙特卡洛算法_用Python实现基于蒙特卡洛算法小实验

    用Python实现基于蒙特卡洛算法小实验 蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯· 诺伊曼 ,他在20世纪40年代中期用驰名世界的赌城- ...

  6. 从伪随机数的产生到高大上的蒙特卡洛算法(C语言实现)

    一 准备 1 生成任意区间任意大小的伪随机数 2 什么是蒙特卡洛算法 二蒙特卡洛算法的实现 1 pi的蒙特卡洛计算方式 2 特殊图形的蒙特卡洛计算方式 通过这篇短文想说明两个道理: 看似高大上.神秘兮 ...

  7. python实验原理_Python实现蒙特卡洛算法小实验过程详解

    蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...

  8. 蒙特卡洛算法求矩形内切圆面积

    已知:矩形长宽皆为1,则内切圆半径为0.5.求:该圆面积(利用蒙特卡洛算法) 编程思路如下: 1,利用random.unifom生成0到1之间的数字,分别赋值给x,y. 2,判断生成点是否落在矩形区域 ...

  9. 程序实现蒙特卡洛算法计算PI值和积分

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

最新文章

  1. Json 学习 JSONObject 和 JSONArray
  2. 前端框架除了layui还有哪些
  3. 工作192:vue项目如何刷新当前页面
  4. python之Map函数
  5. 云服务器 性能监控软件,云监控 - 云应用监控 - ManageEngine Applications Manager
  6. 【树莓派】做一个备份镜像
  7. 如何在ppt下面加入讲解内容_如何批量查找并修改替换 Word、PPT、Excel、PDF、TXT等文件的内容——我的ABC...
  8. 叔丁基氢醌(TBHQ)行业调研报告 - 市场现状分析与发展前景预测
  9. 工具的使用——谷歌浏览器(chrome)
  10. MySQL5.7 踩坑实录
  11. JAVA并发编程实践-中文-高清-带书签-完整版
  12. java:输入小写字母转为大写字母
  13. Linux面试题史上最全总结
  14. go[x]agent在windows和ubuntu下的安装步骤
  15. 单片机毕业设计 stm32万能红外遥控器
  16. 三维建模渲染——铁链束缚的花朵
  17. Im4java + ImageMagick 缩略图补白加边
  18. 什么因素影响阿里云国际版云服务器延迟?
  19. python基础(1)---python简介
  20. 日文IT词汇的中文翻译

热门文章

  1. 台式计算机快捷键大全,电脑常用快捷键有哪些
  2. Fiddler爬取抓包(网页及小程序包)
  3. 蓝桥基础练习 特殊的数字 JAVA
  4. calcite是什么
  5. python输出多行数据合并_pandas之多行按类合并为一行
  6. 联邦学习学习笔记——论文理解《Communication-Efficient Learning of Deep Networks from Decentralized Data》
  7. tomcat两种启动方式
  8. Devops实现之jenkins (二)
  9. 6大论坛,30+技术干货议题,2022首届阿里巴巴开源开放周来了!
  10. 【必知必会的MySQL知识】②使用MySQL