阿白数模笔记之蒙特卡罗方法(Monte Carlo Method)

前言

        还记得浦丰投针实验吗?

59a478351cda43c4a3b2000bbe3df317.pngc3ed920196804c4d8e63acf4fa018c8f.png

浦丰所进行的是一个概率实验(Probability experiment),这样的方法称为蒙特卡罗方法(Monte Carlo Method)。而蒙特卡罗(Monte Carlo)是世界著名的“赌城”,世界三大赌城之一(美国超级赌城拉斯维加斯与号称东方拉斯维加斯的中国澳门)。事实上还有拉斯维加斯方法(本文不涉及)。

        本文将通过几个案例解释蒙特卡罗方法的原理和应用。

案例一

fbda9daf6d1345358fc0b73427383f5b.png往正方形区域D={(x,y):x∈[−1,1],y∈[−1,1]}内生成随机点,在单位圆区域C={(x,y):x2+y2≤1}内的点和点的总数之比近似为~pi/4。随着实验样本总数的改变,结果越来越精确,不加证明的给出此例中增加一位小数精度需使用100倍的样本数。MATLAB实现如下:

①绘制图形

x=[1,-1,-1,1,1];
y=[1,1,-1,-1,1];%将正方体的角连起来
t=linspace(0,2*pi,1000);
x1=cos(t);y1=sin(t);
plot(x,y,x1,y1);
legend('square','circle')
title('Square inscribed circle')
axis([-1.5 1.5 -1.5 1.5]);

②生成随机点列

xt=unifrnd(-1,1,[n,1]);%testblock&times
yt=unifrnd(-1,1,[n,1]);

③筛选计数

k=0;
for i=1:n
    if (xt(i,1)^2+yt(i,1)^2)<=1
        k=k+1;
        scatter(xt(i,1),yt(i,1),'r*')
    else
        scatter(xt(i,1),yt(i,1),'b*')
    end
end
p=4*k/n;%估计值
e=p-pi;%误差

④精度分析

5fe854b0349140acb56773ec66348815.png9032dab898d645e99aa7f3bf8ae30cff.png

案例二

8460b86c321f4c039164f5a31fc464d8.png       Monte Carlo method 对维数并不敏感,可被用来计算多重积分。左图是计算球的面积

x=[1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1];
y=[-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1];
z=[1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1];
plot3(x,y,z);%绘制正方体
axis([-1.5,1.5,-1.5,1.5,-1.5,1.5]);
hold on;
n=5000;
[x1,y1,z1]=sphere(50);%绘制球体
mesh(x1,y1,z1);
title('Cube inscribed sphere');
xt=unifrnd(-1,1,[n,1]);%testblock&times
yt=unifrnd(-1,1,[n,1]);
zt=unifrnd(-1,1,[n,1]);
k=0;
for i=1:n
    if (xt(i)^2+yt(i)^2+zt(i)^2)<=1
        scatter3(xt(i),yt(i),zt(i),'r*')
        k=k+1;
    else
        scatter3(xt(i),yt(i),zt(i),'b*')
    end
end
p=k/n*6;
e=p-pi;

案例三

下面利用Monte Carlo method求解浦丰投针问题:

考虑针的中点x位置,不妨设2%29,a是平行线簇的间距,设针与平行线所成角度为gif.latex?%5Cthetagif.latex?%2C%5Ctheta%20%5Cepsilon%20%280%2C%5Cpi%29,则当针与线相交时,2*sin%5Ctheta,针落在线上的概率为%28%5Cpi*a%29,再利用Monte Carlo方法计算积分值即知

为方便计算,取gif.latex?a%3D2%2Cl%3D1

plot([0,pi],[1,1],'linewidth',2);
t=linspace(0,pi,1000);
y=0.5*sin(t);
hold on
plot(t,y);
n=10000;
x1=unifrnd(0,pi,[n,1]);
y1=unifrnd(0,1,[n,1]);
k=0;
for i=1:n
    if y1(i)<0.5*sin(x1(i))
        k=k+1;
        scatter(x1(i),y1(i),'r*')
    else
        scatter(x1(i),y1(i),'b*')
    end
end
axis([0,pi,0,1]);
p=n/k;
e=p-pi;

001efd8568f14802a0c5d8aa07a781ea.png总结

        案例一,二是Monte Carlo method在二维,三维的应用,没有本质差别(维数对Monte Carlo method影响很小),案例三是先用数学方法从概率实验中抽离出待求式再通过Monte Carlo method计算。而Monte Carlo 的缺点也很明显:1.对于确定性问题需要转化成随机性问题。2.误差是概率误差。3.通常需要较多的计算步数N.

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿白啥也不会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值