蒙特卡罗(洛)模拟——手把手教你数学建模

本文介绍了蒙特卡罗模拟的基本概念,它是一种使用随机数进行计算的方法,尤其适用于复杂问题的近似解。通过MatLab代码示例,展示了如何运用蒙特卡罗模拟估算自然对数底数e的值和解决非线性规划问题,揭示了该方法在实际问题中的应用和效率。
摘要由CSDN通过智能技术生成

定义

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

通俗的讲,就是通过 生成大量随机数 进行模拟 得最优解(近似最优解)的方法。

原理

由大数定理可知,当样本容量足够大时,事件的发生频率即为其概率。

注:蒙特卡罗模拟不是一种算法。准确的来说只是⼀种思想,或者是一种方法。

应用示例(附MatLab代码)

应用一:估计自然对数的底数 e 的值

类似布丰用投针实验估计了 π 值,一群人每人写一张卡片,卡片上是自己的名字。把卡片收上去,打乱次序,再随机地发给每一个人。每个人拿到的都不是自己卡片的概率趋近于1/e,多做几次这个实验,用频率代替概率,求倒数,就可以了。

MatLab代码示例

clear;clc
tic  %计算tic和toc中间部分的代码的运行时间
n = 100; % 总人数
N = 10000000; % 循环的次数
unequal = 0; % 每个人收到的卡片都不是自己的

for i = 1:N % 循环N次
    X = randperm(n); % 生成新的随机数序列,模拟给每个人发卡片
    judge = 0; % judge = 0,则每个人收到的卡片都不是自己的
    for j = 1:n
        if X(j) == j
            judge = 1; % 如果存在有人收到的卡片是自己的,便记judge为1,跳出循环
            break;
        end
    end
    if judge == 0
        unequal = unequal + 1;
    end
end

e_1 = unequal / N; % 每个人拿到的都不是自己卡片的概率为1/e
e = e_1^-1; % 取倒数求e
disp(['蒙特卡罗估计的自然常数e的值为',num2str(e)]); % 打印e的值(自然常数真实值约为2.7182)
toc  %计算tic和toc中间部分的代码的运行时间

输出结果

蒙特卡罗估计的自然常数e的值为2.7188
时间已过 54.929325 秒。

简化版本的代码

clear;clc
tic  %计算tic和toc中间部分的代码的运行时间
n = 100; % 总人数
N = 10000000; % 循环的次数
unequal = 0; % 每个人收到的卡片都不是自己的

for i = 1:N % 循环N次
    X = randperm(n); % 生成新的随机数序列,模拟给每个人发卡片
    if isempty(find(X == [1:n])) % 直接将新的随机数序列与1-n的顺序数列作比较
        % find(X)可以用来返回这个向量中非零元素的下标,如果X中所有元素都为0,则返回空值
        % isempty(X)函数可以用来判断X是否为空, 如果X为空, isempty(X) 返回逻辑值1(true),否则返回逻辑值0(false)。
        unequal = unequal + 1;
    end
end

e_1 = unequal / N; % 每个人拿到的都不是自己卡片的概率为1/e
e = e_1^-1; % 取倒数求e
disp(['蒙特卡罗估计的自然常数e的值为',num2str(e)]); % 打印e的值(自然常数真实值约为2.7182)
toc  %计算tic和toc中间部分的代码的运行时间

输出结果

蒙特卡罗估计的自然常数e的值为2.718
时间已过 60.641203 秒。

可以看到使用蒙特卡罗估计出的自然常数e的值基本接近其实际值。
如果你想知道本题具体的数学推导过程,可见知乎 - 布丰用投针实验估计了 π 值,那么用什么简单方法可以估计自然对数的底数 e 的值?

应用二:求解非线性规划问题

蒙特卡罗求解非线性规划问题

(1)MatLab代码——初次寻找最小值

clc,clear;
format long g   %可以将Matlab的计算结果显示为一般的长数字格式(默认会保留四位小数,或使用科学计数法)
tic  %计算tic和toc中间部分的代码的运行时间
n = 10000000; % 生成的随机数的组数
x1 = unifrnd(0,16,n,1); % 生成在[0,16]之间均匀分布的随机数组成的n行1列的向量构成x1
x2 = unifrnd(0,8,n,1);  % 生成在[0,8]之间均匀分布的随机数组成的n行1列的向量构成x2
fmin = inf; % 初始化 fmin = 正无穷
X = zeros(1,2); % 初始化储存最小处x1, x2值的数组
for i = 1:n
    x = [x1(i), x2(i)];
    if( x(1)+2*x(2) < 16 & x(1)+2*x(2) < 16 )
        r = 2*(x(1)^2)+x(2)^2-x(1)*x(2)-8*x(1)-3*x(2);
        if(r < fmin)
            fmin = r;
            X = x;
        end
    end
end
disp(['f(x)最小值为:', num2str(fmin)]); % 注意:此处原本的字符串不能用双引号。
disp('最小处x1, x2值为:');
disp(X);
toc  %计算tic和toc中间部分的代码的运行时间 

输出结果

f(x)最小值为:-15.1429
x1, x2值为
          2.71485111081151          2.85830659834113
          
时间已过 1.780016 秒。

(2)MatLab代码——缩小范围重新模拟得到更加精确的取值

clc,clear;
format long g   %可以将Matlab的计算结果显示为一般的长数字格式(默认会保留四位小数,或使用科学计数法)
tic  %计算tic和toc中间部分的代码的运行时间
n = 10000000; % 生成的随机数组数
x1 = unifrnd(2.5,3,n,1); % 生成在[2.5,3]之间均匀分布的随机数组成的n行1列的向量构成x1
x2 = unifrnd(2.5,3,n,1);% 生成在[2.5,3]之间均匀分布的随机数组成的n行1列的向量构成x2
fmin = inf; % 初始化 fmin = 正无穷
X = zeros(1,2); % 初始化储存最小处x1, x2值的数组
for i = 1:n
    x = [x1(i), x2(i)]; % 构造x向量,储存第i个x1,x2对应值。
    if(x(1)+2*x(2) < 16 & x(1)+2*x(2) < 16)
        r = 2*(x(1)^2)+x(2)^2-x(1)*x(2)-8*x(1)-3*x(2);
        if(r < fmin)
            fmin = r;
            X = x;
        end
    end
end
disp(['f(x)最小值为:', num2str(fmin)]); % 注:此处原本的字符串不能用双引号。
disp('最小处x1, x2值为:');
disp(X);
toc  %计算tic和toc中间部分的代码的运行时间 

输出结果

 f(x)最小值为:-15.1429
 x1, x2值为
           2.71423617782718          2.85717715949967

 时间已过 1.758372 秒。
YOLOv5是目标检测算法的一种,通过训练自己的数据集可以实现对自定义目标的检测。下面是YOLOv5入门实践的步骤。 第一步,准备数据集。首先收集一些与你想要检测的目标相关的图像,确保图像的目标已标注好边界框坐标。将图像和对应的标注文件放在数据集文件夹。 第二步,配置运行环境。需要在计算机上安装Python环境,并根据YOLOv5的要求安装相应的库和依赖。可以通过pip或conda进行安装。 第三步,调整配置文件。YOLOv5提供了一个默认的配置文件,可以根据自己的需求进行修改。主要需要调整的是类别数量和路径配置。 第四步,划分训练集和验证集。将数据集的图像和标注文件划分为训练集和验证集,一般可以按照70%的比例划分。 第五步,训练模型。在终端运行训练命令,指定相关参数,如模型类型、数据集路径、训练集和验证集路径等。训练时可以选择使用预训练权重或从头开始。 第六步,评估模型。训练完成后,可以通过评估命令对模型进行评估,得到关于模型性能的指标,如精确度、召回率等。 第七步,使用模型进行目标检测。训练完成的模型可以用于检测自定义数据集的目标。可以在终端运行检测命令,指定相关参数,如模型路径、检测图像路径等。 通过以上步骤,我们可以进行YOLOv5的入门实践,训练自己的数据集,并使用训练好的模型进行目标检测。随着更多的实践和调优,可以提高模型性能和检测效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Uncle Tan_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值