https://blog.csdn.net/narcissus2_/article/details/99647407

概览

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

引例

为了求得圆周率π值,在十九世纪后期,有很多人作了这样的试验:将长为2l的一根针任意投到地面上,用针与一组相间距离为2a( l<a)的平行线相交的频率代替概率P,再利用准确的关系式:

在这里插入图片描述

求出π值

在这里插入图片描述

基本思想

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

特点

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

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

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

主要应用范围:

粒子输运问题(实验物理,反应堆物理)
统计物理
典型数学问题
真空技术
激光技术
医学
生物
探矿等

蒙特卡洛方法步骤如下:

1在区间[a,b]上利用计算机均匀产生n个随机数x1,x2…xn,使用matlab软件的unifrnd命令实现。

2计算每一个随机数想对应的被积函数值f(x1),f(x2),f(xn)

计算被积函数值的平均值。

在这里插入图片描述

在这里插入图片描述

蒙特卡洛求解积分

在这里插入图片描述

在这里插入图片描述
求解定积分相当于计算一个图形的面积。
按照牛顿和莱布尼兹的方法,我们是把区间划分成无限份,每份长为△t,高为f(a+z△t),f(a+z△t),这样来计算面积。
无论图形的形状如何,图形面积一定能被转化成一个以ab为底,y为高(y可以是负数)的长方形面积高,我们只需要用蒙特卡洛算法求y即可。
那么y怎么求,其实非常简单,我们只需要在a~b之间生成n个随机点,计算相应的f(x1),f(x2)…

在这里插入图片描述

在这里插入图片描述

 P=rand(10000,4);
 x=-1+2*P(:,1); y=-1+2*P(:,2);
 z=P(:,3);u=2*P(:,4);
 II=find(z>sqrt(x.^2+y.^2)&z<=1&u<=x.^2+y.^2+z.^2);
 M=length(II);
 V=8*M/10000

在这里插入图片描述

function icecream(m,n) 
if nargin==0,m=20;n=100;end
t=linspace(0,2*pi,n);
r=linspace(0,1,m);
x=r'*cos(t);y=r'*sin(t);
z1=sqrt(x.^2+y.^2);
z2=1+sqrt(1+eps-x.^2-y.^2);
X=[x;x];Y=[y;y];
Z=[z1;z2];
mesh(X,Y,Z)
view(0,-18)
colormap([0 0 1]),axis off

https://blog.csdn.net/qq_40605167/article/details/100031833
https://www.cnblogs.com/youngsea/p/7457683.html

2.两个应用例子

例子1:求π的值。

正方形内部有一个相切的圆,它们的面积之比是π/4。现在,在这个正方形内部,随机产生1000000个点(即1000000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部。如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。

在这里插入图片描述

N=1000000;    %随机点的数目
x=rand(N,1);  %rand 生成均匀分布的伪随机数。分布在(0~1)之间
y=rand(N,1);  %矩阵的维数为N×1
count=0;
for i=1:N
   if (x(i)^2+y(i)^2<=1)
     count=count+1;
    end
end
PI=4*count/N

例子2:计算积分

计算函数 y = x^2 在 [0, 1] 区间的积分,就是求出红色曲线下面的面积。这个函数在 (1,1) 点的取值为1,所以整个红色区域在一个面积为1的正方形里面。在该正方形内部,产生大量随机点,可以计算出有多少点落在红色区域(判断条件 y < x^2)。这个比重就是所要求的积分值。

在这里插入图片描述

clear
clc
N=10000;  
x=rand(N,1); 
y=rand(N,1);
count=0;
for i=1:N
   if (y(i)<=x(i)^2)
     count=count+1;
   end
end
result=count/N

3. 与拉斯维加斯方法的比较

(1)蒙特卡罗算法:假如筐里有100个苹果,让我每次闭眼拿1个,挑出最大的。于是我随机拿1个,再随机拿1个跟它比,留下大的,再随机拿1个……我每拿一次,留下的苹果都至少不比上次的小。拿的次数越多,挑出的苹果就越大,但我除非拿100次,否则无法肯定挑出了最大的。——尽量找好的,但不保证是最好的。

特点:采样越多,越近似最优解;

(2)拉斯维加斯方法:假如有一把锁,给我100把钥匙,只有1把是对的。于是我每次随机拿1把钥匙去试,打不开就再换1把。我试的次数越多,打开(最优解)的机会就越大,但在打开之前,那些错的钥匙都是没有用的。——尽量找最好的,但不保证能找到。

特点:采样越多,越有机会找到最优解。
4.利用蒙特卡罗算法求机器人的工作空间

思想:设置机器人每个关节角的运动范围,利用蒙特卡罗算法求机器人工作空间。

%**************************蒙特卡洛法求解机器人工作空间*********************

%定义变量
deg=pi/180;
num=0.001;

%定义关节角范围
theta1=[-180,180]*deg;
theta2=[-90,90]*deg;
theta3=[-150,150]*deg;
theta4=[-150,150]*deg;
theta5=[-180,180]*deg;
theta6=[-180,180]*deg;

%定义连杆变量
a2=612.7*num;
a3=571.6*num;
d2=163.9*num;
d5=115.7*num;

%生成一个数组来保存随机变量
i=1:20000;
PX=zeros(size(i));
PY=zeros(size(i));
PZ=zeros(size(i));
%设置随机点
for j=1:1:10000
    %randNum=rand();

    theta1=(-180+360*rand());
    theta2=(-90+180*rand());
    theta3=(-150+300*rand());
    theta4=(-150+300*rand());
    theta5=(-180+360*rand());
    theta6=(-180+180*rand());
    
%根据运动学方程,求出机械臂末端执行器在基坐标中的位置向量表达式
   PX(j)=cos(theta1)*(d5*sin(theta2+theta3+theta4)+a2*cos(theta2)+...
       a3*cos(theta2+theta3))+d2*sin(theta1);
   PY(j)=sin(theta1)*(d5*sin(theta2+theta3+theta4)+a2*cos(theta2)+...
        a3*cos(theta2+theta3))-d2*cos(theta1);
   PZ(j)=d5*sin(theta2+theta3+theta4)+a3*sin(theta2+theta3)+a2*sin(theta2);
end

%求解坐标值并且输出三视图
subplot(2,2,1);
plot3(PX,PY,PZ,'.');
hold on;
subplot(2,2,2);
plot3(PX,PY,PZ,'.');
view([0 0]);
hold on;
subplot(2,2,3);
plot3(PX,PY,PZ,'.');
view(2);
hold on;

5.更深度的应用

蒙特卡洛树搜索—深度学习,强化学习

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐