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

这篇具有很好参考价值的文章主要介绍了蒙特卡罗(洛)模拟——手把手教你数学建模。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

定义

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

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

原理

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

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

应用示例(附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 的值?

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

蒙特卡罗模拟,数学建模,matlab,算法,概率论文章来源地址https://www.toymoban.com/news/detail-700098.html

(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 秒。

到了这里,关于蒙特卡罗(洛)模拟——手把手教你数学建模的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 强化学习中的动态规划与蒙特卡罗方法

    强化学习(Reinforcement Learning,RL)是一种机器学习方法,它通过与环境的互动来学习如何做出最佳决策。强化学习的目标是找到一种策略,使得在长期内累积最大化奖励。强化学习的一个关键特点是它需要在环境中探索和利用,以找到最佳的行为策略。 动态规划(Dynamic Programmi

    2024年02月19日
    浏览(26)
  • 关于蒙特卡罗方法及其在信号处理中的应用

        最近想探讨一下毫米波雷达测量准确度及其改善的问题,这个话题下可供讨论的问题有很多,蒙特卡罗方法(或者说基于蒙特卡罗方法对测量准确度以及精度的评估)是其中之一,该方法是一个十分有效的工具,在科研(发paper)上也是不可少的。在探讨测量的准确度之前,我

    2024年02月05日
    浏览(33)
  • 蒙特卡罗方法:当丢失确定性时的处理办法

    蒙特卡罗(Monte Carlo),也可翻译为蒙特卡洛,只是不同的音译选词,比较常用的是蒙特卡罗。是摩洛哥的一片城区,以拥有豪华赌场闻名,蒙特卡罗方法是基于概率的。基本思想:如果你想预测一件事情的结果,你只要把随机生成的各种输入值,把这件事模拟很多遍,根据

    2023年04月10日
    浏览(29)
  • 学习深度强化学习---第3部分----RL蒙特卡罗相关算法

    本部分视频所在地址:深度强化学习的理论与实践 在其他学科中的蒙特卡罗法是一种抽样的方法。 如果状态转移概率是已知的,则是基于模型的方法。如果状态转移概率是未知的,则是免模型的方法。动态规划方法无法求解倒立摆问题,即无法处理没有状态转移概率的问题

    2024年02月04日
    浏览(35)
  • 随机游走任务中时间差分(0)和常数α蒙特卡罗方法的比较

            在这篇文章中,我们讨论了常α MC 方法和 TD(0) 方法之间的区别,并比较了它们在随机游走任务中的性能。TD方法在本文的所有测试中都覆盖了MC方法,因此将TD视为强化学习任务的方法是更可取的选择。         蒙特卡洛(MC)和时间差分(TD)方法都是强化

    2024年02月10日
    浏览(30)
  • MATLAB运动学之蒙特卡罗法求积分与机器人工作域分析

    蒙特卡罗法又叫做统计模拟法、随机抽样技术,是一种随机模拟方法以概率和统计理论方法为基础的一种计算方法,通俗来说是可以使用随机数来解决很多计算问题的一种方法,很直观简单,尤其对于一些求解积分无解的情况,非常好使且简单粗暴。 以 y = x² 为例,我们需要

    2024年02月04日
    浏览(31)
  • R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列

    本文详细介绍了如何使用R语言进行随机波动模型SV的模拟和估计,包括马尔可夫蒙特卡罗法(MCMC)、正则化广义矩估计法和准最大似然估计法。

    2024年02月10日
    浏览(43)
  • 手把手教你SHA-256

    SHA-256是SHA-2协议簇的一部分,也是当前最流行的协议算法之一。在本篇文章中,我们会了解这个密码学算法的每一个步骤,并且通过实例演示。SHA-2因它的安全性(比SHA-1强很多)和速度为人所知。在没有键(keys)生成的情况下,例如挖掘比特币,像SHA-2这样的快速哈希算法很

    2024年02月13日
    浏览(57)
  • 手把手教你暴力破解

    暴力破解是一种攻击手段,使用大量的认证信息在认证接口尝试登录,直到得到正确的结果。 2.1标题基于表单的暴力破解 2.1.1 第一步:打开burpsuite拦截 2.1.2 第二步:将拦截到的包右击发送到intruder模块 (其中简单介绍一下intruder模块) Target主要是设置暴力破解访问的host地址

    2024年02月07日
    浏览(37)
  • 手把手教你落地DDD

    一、前言 常见的DDD实现架构有很多种,如经典四层架构、六边形(适配器端口)架构、整洁架构(Clean Architecture)、CQRS架构等。架构无优劣高下之分,只要熟练掌握就都是合适的架构。本文不会逐个去讲解这些架构,感兴趣的读者可以自行去了解。 本文将带领大家从日常的

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包