数学建模——蒙特卡罗法

发布于:2025-08-02 ⋅ 阅读:(18) ⋅ 点赞:(0)

主成分分析实在是有点难啊,萌新看不懂,过两天研究一下再说

蒙特卡罗法的基本概念

蒙特卡罗法(Monte Carlo Method)是一种基于随机采样的数值计算方法,通过重复随机抽样来近似求解数学、物理或工程问题。其核心思想是利用概率统计理论,通过大量实验结果的统计平均来逼近目标值。

核心是:用大量随机数或者统计大量数据来实现某一个目标,原理就是大数定理,当样本容量足够大时发生频率即为其概率

 数学建模没有专门的蒙特卡罗算法,要根据实际需求写代码

常见的蒙特卡罗算法:

示例:

1.计算圆周率π

  1. 在单位正方形内随机投点,坐标为((x, y)),(x, y \in [0,1])
  2. 统计落在单位圆内的点数量 (M)(满足(x^2 + y^2 \leq 1))。
  3. 圆周率估计值为:
    [ \pi \approx 4 \cdot \frac{M}{N} ]
    其中 (N) 为总投点数。
  4. 代码
    clc; clear;
    % 参数初始化:投放10000个点,圆半径为1,圆心坐标(1,1)
    % 初始时还未投放点,有0个点在圆内
    p = 10000;
    r = 1;
    x0 = 1;
    y0 = 1;
    n = 0;
    
    hold on; % 保持绘图窗口,多次绘图
    for i = 1:p % 对于要投放的总共p个点
        % rand函数产生在(0,1)之间的随机数
        px = rand * 2; % 随机生成该点的横坐标
        py = rand * 2; % 随机生成该点的纵坐标
        
        % 若该点在圆内,则颜色设为蓝色,变量n加一;在圆外则设为红色
        if (px - 1)^2 + (py - 1)^2 < 1 % 横纵坐标的平方和小于半径,则在圆内
            plot(px, py, '.', 'Color', 'b');
            n = n + 1;
        else
            plot(px, py, '.', 'Color', 'r');
        end
    end
    
    axis equal; % 绘图时横纵坐标单位长度相同,便于观察圆
    s = (n / p) * 4;
    pi0 = s;
  5. 这里补充一个为什么用hold on以及随机数生成

1. hold on

 在 MATLAB 中,hold on 用于保留当前图形窗口中的已有图形内容,使后续绘图命令不会覆盖已有图形。默认情况下,每次调用绘图函数(如 plotscatter)会清除之前的图形并重新绘制。 

使用场景

  • 叠加绘图:在同一坐标系中绘制多条曲线或图形时,避免覆盖之前的内容。
  • 对比数据:将多组数据绘制在同一图中,便于直观对比趋势或分布。

2. 随机数生成

生成均匀分布的随机数

使用 rand 函数生成 [0, 1) 区间内均匀分布的随机数。

  • 生成单个随机数:r = rand
  • 生成 m×n 矩阵随机数:R = rand(m, n)
  • 生成指定区间 [a, b] 的均匀随机数:R = a + (b-a)*rand(m, n)

生成正态分布的随机数

使用 randn 函数生成标准正态分布(均值为0,标准差为1)的随机数。

  • 生成单个随机数:r = randn
  • 生成 m×n 矩阵随机数:R = randn(m, n)
  • 生成自定义参数的正态随机数(均值 mu,标准差 sigma):
    R = mu + sigma*randn(m, n)

生成随机整数

使用 randi 函数生成指定范围内的随机整数。

  • 生成 [1, k] 的随机整数:r = randi(k)
  • 生成 [a, b] 的随机整数矩阵:R = randi([a, b], m, n)

 

2.投针实验

投针实验(Buffon's Needle Experiment)是18世纪法国数学家布丰(Georges-Louis Leclerc, Comte de Buffon)提出的概率问题,用于通过物理实验估算圆周率π的值。其核心思想是通过随机投掷针到平行线平面上,利用几何概率计算针与线相交的概率,进而推导π的近似值。

 假设平面上有一组间距为d的平行线,针的长度为l(要求l ≤ d)。随机投掷针时,针与任一条平行线相交的概率P与π相关,公式为:
[ P = \frac{2l}{\pi d} ]
通过大量实验统计相交次数N与总投掷次数T的比值(即频率),可近似概率P ≈ N/T,从而反推π的估计值:
[ \pi \approx \frac{2l \cdot T}{d \cdot N} ]

3.三门问题

三门问题(Monty Hall Problem)源自美国电视节目《Let's Make a Deal》,由主持人Monty Hall命名。问题描述如下:

  • 参与者面前有三扇关闭的门,背后分别是一辆车和两只山羊。
  • 参与者选择一扇门(如门1),主持人(知道门后情况)会打开另一扇有山羊的门(如门3),并询问是否改选门2。
  • 问题的核心是:坚持原选择或改选,哪种策略赢得汽车的概率更高?

经典解答

改选策略的胜率为2/3,坚持原选择的胜率为1/3

  • 初始选择正确的概率为1/3,此时坚持获胜,改选失败。
  • 初始选择错误的概率为2/3(车在其他两扇门后),主持人会排除错误选项,改选必然获胜。
n = 100000;          % n 代表蒙特卡罗模拟重复次数
a = 0;               % a 表示不改变主意时能赢得汽车的次数
b = 0;               % b 表示改变主意时能赢得汽车的次数
c = 0;               % c 表示没有获奖的次数

for i = 1:n          % 开始模拟 n 次
    x = randi([1,3]); % 汽车在门 x 后
    y = randi([1,3]); % 参赛者最初选的 y
    change = randi([0,1]); % 0 不改变,1 改变
    
    if x == y
        % 初始门就是汽车门
        if change == 0
            a = a + 1;   % 不改变则赢
        else
            c = c + 1;   % 改变则输
        end
    else
        % 初始门不是汽车门
        if change == 1
            b = b + 1;   % 改变则赢
        else
            c = c + 1;   % 不改变则输
        end
    end
end

disp(['不改变主意时的获奖概率:', num2str(a/n)]);
disp(['改变主意时的获奖概率:',   num2str(b/n)]);
disp(['未获奖的概率:',           num2str(c/n)]);


网站公告

今日签到

点亮在社区的每一天
去签到