美赛BOOM数学建模1-2蒙特卡洛法

注明:文章根据数学建模BOOM网课整理,自用

❑方法简介

❑ 随机抽样、统计试验

• 当无法求得精确解时,进行随机抽样,根据统计试验求近似解

❑ 通俗理解

• 假如有十万个苹果,需要挑选出其中最大的,但只能闭着眼睛挑,手里最多保留一个苹果。初始时可以先闭着眼睛随机挑选,拿到一个苹果。

• 然后,可继续闭着眼睛挑一个,并与手里现有的比较,留下较大的、扔掉较小的

• 循环重复上一步,则挑的次数越多,挑出最大苹果的可能性也就越大

• 但人的时间精力有限,除非把十万苹果都挑一遍,否则无法确定挑出来的就是最大的。所以挑了30000后,就把此时手里的苹果视为十万个苹果中最大的近似解

❑ 翻译翻译

• 十万个苹果挑最大:可行域过大、没有通用方法求出精确解(十万个全挑完不现实)

• 闭眼挑:随机抽样

• 每次挑完留下大的:统计试验

• 挑30000次后手里的视为最大:求近似解

• 挑的次数越多接近最大的概率越大:需构成统计意义

❑ 简单例题

• 圆周率π没有精确值,如何求出其近似值?思路:

• 1、什么时候会用到π?求面积的时候;如果能求到面积的近似值,自然能求得π的近似值;

• 2、一个半径为1的圆,与其相关的其外切正方形面积精确值4;

• 3、若在正方形内随机大量的点,有些落在圆内,有些落在圆外;

• 4、统计意义上,圆内点数 / 总点数 = 圆面积 / 正方形面积;

5、第4条中有3项是有统计值或精确值的,所以可求出“圆面积”的统计意义值即近似值

• 6、圆面积S = π*(r^2),基于前5条即可求出π的近似值

❑代码求解

❑方法分析

• 为实现随机撒点,可用matlab自带的rand函数

• 撒的点数越多,求得的解越可能更接近最优解

❑ 注意事项

• 蒙特卡罗法并不是 “算法”,而是一种方法、思路,不同问题写出的代码可能千差万别

• 例如本题前面所讲的6步分析中是利用“圆和外切正方形面积关系”来求解,换一道题,就

得重新制定求解步骤,不一定套用“撒点求面积比值的统计近似”

• 严格来说,就是不同问题有不同的概率分布本题是均匀分布,常见的还有泊松分布、正态

分布、指数分布等等,需要根据问题分别制定策略

❑ 重点

• 无法求得精确解时,根据统计试验求近似解

随机性:matlab中的rand函数,rand(n)意味着生成n个介于0到1的随机数

统计性:n要足够大,太少的话不构成统计意义

近似解:并不是严格的精确解。如果有求精确解的方法,就不要求近似!!!

蒙特卡洛法求解圆周率近似值
% 
clc;clear
% 参数初始化:投放10000个点,圆半径为1,圆心坐标(1,1)
% 初始时还未投放点,有0个点在圆内,p为一共撒的点数;n代表落在圆内的点
p = 10000;  r = 1; x0 = 1;  y0 = 1;  n = 0; 

%将p个点随机放在一个边长为2的正方形内,该正方形内有个内切圆;
%正方形的面积是4;
%因为每个点都是“随机投放”的,最终落在圆内的点数比上总点数,就近似等于圆的面积比上正方形面积;
%即pi*(r^2)/4 = (圆内点数)/(总点数);

hold on     % 保持绘图窗口,多次绘图
for i = 1:p     % 对于要投放的总共p个点
    % rand函数产生在(0, 1)之间的随机数;rand函数还有其他多种形式,可自行百度
    px = rand*2;    % 随机生成该点的横坐标 ,px为0~2 
    py = rand*2;    % 随机生成该点的纵坐标
    % 所以,
    % 若该点在圆内,则颜色设为蓝色,变量n加一;在圆外则设为红色
    if (px-1)^2 + (py-1)^2 < 1      % 横纵坐标的平方和小于半径,则在圆内
        plot(px,py,'.','Color',"b");  %plot表示绘图 “.”表示画成.这个形状;颜色为blue
        n = n+1
    else
        plot(px,py,'.','Color',"r");
    end
end
axis equal      % 绘图时横纵坐标单位长度相同,便于观察圆
s = (n/p)*4;
pi0 = s;

% 注意:matlab本身有圆周率值,在计算时直接调用pi即可
% 例:a = 2*pi

你可能感兴趣的:(数学建模,经验分享,matlab,算法,开发语言,推荐算法)