0
点赞
收藏
分享

微信扫一扫

基于蒙特卡洛算法的蒲丰氏问题

郝春妮 2022-01-26 阅读 58
算法matlab

蒙特卡洛算法应该是数学建模中最最基础的建模算法,而蒲丰氏问题也是其中最经典的题目,我看csdn上有关蒲丰氏问题的讲解都一些文章(说白了就是要钱),所以跟大家分享一下我有关的学习以及思考。

一、蒙特卡洛算法

1.简介

蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第二次世界大战进行研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。

2.用处

当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种“试验”的方法,得到这种事件出现的频率,或者这个随机变数的平均值,并用它们作为问题的解。这就是蒙特卡罗方法的基本思想。蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模拟实验。它是以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。说白了就是用成千上万次的实验去撞运气,去寻求最优解。

3.优点

算法比较简单,时间消耗比较少,在其他算法都比较复杂的时候,蒙特卡洛算法不乏是一个比较好的选择。在数学建模竞赛时,蒙特卡洛算法常用于答案的检验,这样可以确保答案的正确性。蒙特卡洛算法也常用于一些复杂算法先求一个较好的初始解,比如像模拟退火法等等就是先用蒙特卡洛方法寻找初始解。

4.缺点

由于是随机进行许多次的实验,所以运行时间较长,比较考验电脑性能,比如我在跑下面的蒲丰氏问题的时候开始这设置的是丢10万根针,跑了大半分钟,最后运行完了之后整个电脑都直接卡了,等了半天才弄好。而且蒙特卡洛算法的精度很低,有时候我运行10万次得出来还有0.005的误差(相对于\pi来说)。

二、蒲丰氏问题

为了求得圆周率π值,在十九世纪后期,有很多人作了这样的试验:将长为2l的一根针任意投到地面上,用针与一组相间距离为2ala)的平行线相交的频率代替概率P,这就是古典概率论中著名的蒲丰氏问题。

对每一个角度针与直线相交概率的积分:

由此我们可以得到这个式子:

 根据这个公式我们可以来大致估计出\pi的值。

1.生成0到1000的直线以及10000个随机坐标

clc,clear
t = 0:1:1000;
xl=[0,1000]';
yl=[t;t];
a=1000*rand(1,10000);
b=1000*rand(1,10000);
c=pi*rand(1,10000);

 2.找到针的位置并且画上针以及直线

a(2,:)=a(1,:)+1*cos(c);
b(2,:)=b(1,:)+1*sin(c);
plot(xl,yl,a,b)

3.判断多少根针压到了直线,并且计算出\pi的估计值

flag=0;
for k=0:1000
    for j=1:10000
        if b(1,j)<=k&&b(2,j)>=k
            flag=flag+1;
        end
    end
end
2*10000/flag

这是完整代码:

clc,clear
t = 0:1:1000;
xl=[0,1000]';
yl=[t;t];
a=1000*rand(1,10000);
b=1000*rand(1,10000);
c=pi*rand(1,10000);
a(2,:)=a(1,:)+1*cos(c);
b(2,:)=b(1,:)+1*sin(c);
plot(xl,yl,a,b)
flag=0;
for k=0:1000
    for j=1:10000
        if b(1,j)<=k&&b(2,j)>=k
            flag=flag+1;
        end
    end
end
2*10000/flag

 

这是我求出来的值,可以说误差还是比较大的

举报

相关推荐

0 条评论