蒙特卡罗(洛)模拟

  • 定义
  • 原理
  • 应用示例(附MatLab代码)
    • 应用一:估计自然对数的底数 e 的值
      • MatLab代码示例
      • 输出结果
      • 简化版本的代码
      • 输出结果
    • 应用二:求解非线性规划问题
      • (1)MatLab代码——初次寻找最小值
      • 输出结果
      • (2)MatLab代码——缩小范围重新模拟得到更加精确的取值
      • 输出结果

定义

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

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

原理

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

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

应用示例(附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:nif X(j) == jjudge = 1; % 如果存在有人收到的卡片是自己的,便记judge为1,跳出循环break;endendif judge == 0unequal = unequal + 1;end
ende_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
ende_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:nx = [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;endend
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:nx = [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;endend
end
disp(['f(x)最小值为:', num2str(fmin)]); % 注:此处原本的字符串不能用双引号。
disp('最小处x1, x2值为:');
disp(X);
toc  %计算tic和toc中间部分的代码的运行时间

输出结果

 f(x)最小值为:-15.1429x1, x2值为2.71423617782718          2.85717715949967时间已过 1.758372 秒。

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

  1. 手把手教您从建模到仿真计算优化改进新能源汽车电驱动系统转子冲片强度

    导读:新能源汽车电驱动系统的主驱电机,正在向高功率密度.高扭矩密度.高效率.低成本.低损耗.轻量化.小型化.集成化.系列化等方向发展.这给各大零部件供应商,提出了一个又一个的新问题和新挑战. 为了降低 ...

  2. 分子动力学模拟手把手教你

    如果你是AMBER的新用户 或对一般的分子动力学模拟毫无了解 可通过此教程入门. 教程简介 这个教程旨在介绍如何使用Amber进行分子动力学模拟,并假设您以前没有使用过Amber. 它专门为想要了解如 ...

  3. 数学建模1(历年问题与模型)

    数学问题 数学模型 程序情况 求解工厂生产总费用最小 LP模型 谢金鑫优化建模与LINGO\program\新建文件夹\ch03 分组匹配效率最高问题   同上 分组匹配效率最高问题   同上 二次规 ...

  4. matlab中gad,10大经典算法matlab代码以及代码详解【数学建模、信号处理】

    [实例简介] 10大算法程序以及详细解释,包括模拟退火,禁忌搜索,遗传算法,神经网络.搜索算法. 图论. 遗传退火法.组合算法.免疫算法. 蒙特卡洛.灰色预测.动态规划等常用经典算法.是数学建模.信号 ...

  5. 明天放假,我放价!一个国庆假期教你学会数学建模

    原价298元,国庆放价! 248元即可报名学习! 数学建模涉及的内容比较广泛,比如碎纸片问题中所涉及的图像识别及神经网络.小区开放问题中所涉及的车流模拟仿真.还有"互联网+"时代的 ...

  6. 数学建模优化和仿真模拟的区别001

    如果我们过于爽快地承认失败,就可能使自己发觉不了我们非常接近于正确!---卡尔·波普尔 数学建模优化和仿真模拟的区别 几十年来,工程师们一直使用模型(Model)来帮助他们理解系统过程并确定最佳解决方 ...

  7. 数学建模清风微信公众号的习题答案(挑战篇-蒙特卡罗思想、枚举法和网格搜索法)

    以下题目来自微信公众数学建模清风老师的题目 蒙特卡罗模拟计算π\piπ 蒙特卡罗模拟求定积分 蒙特卡罗模拟计算概率 枚举法与网格搜索法 以下是个人结合在微信公众号是所学到的知识取做的,如有不正确或不足 ...

  8. 【Python与数学建模】蒙特卡洛模拟仿真(附完整详细代码)

    [Python与数学建模]蒙特卡洛模拟&仿真 零.前言 引例:投针实验 试验描述: 试验分析: 代码实现 蒙特卡洛模拟&仿真的基本介绍 应用实例 实例一.三门问题 问题描述 问题分析与 ...

  9. 【数学建模】蒙特卡洛模拟

    我的总结: 蒙特卡罗模型如果换一个名字就是计算机仿真,(计算机仿真现在的概念要大一点,可以理解为做大型工程的,两者不太一样,但在建模中类似). 个人感觉也可以说蒙特卡洛模型是模拟退火.蚁群等算法的原型 ...

  10. 数学建模-蒙特卡洛模拟(Matlab)

    目录 一.布丰投针实验 二.三门问题 三.单窗口排队办事问题 四.非线性规划问题 五.书店买书问题 六.导弹追踪问题 七.旅行商问题 注意:代码文件仅供参考,一定不要直接用于自己的数模论文中 国赛对于 ...

最新文章

  1. 石墨文档Websocket百万长连接技术实践
  2. 扩增子统计绘图8网络图-MENA
  3. CSS的overflow:规定当内容溢出元素框时发生的事情
  4. 【Tools】Visual Studio 2010下载和安装
  5. delete in ST05 trace - deletion will also lead to many DB access first
  6. C语言入门经典题目及其答案
  7. C++实现各种交换排序(冒泡,快速)
  8. logback日志pattern_@Slf4j 实现日志输入到外部文件
  9. IDEA设置自动导包功能
  10. nginx1.8.0安装
  11. java如何输出完整的图_java实现输入输出图片
  12. Java调用大华车牌识别摄像头_第三方软件调用大华网络摄像头监控
  13. ffmpeg解码器使用
  14. 方正飞翔加密锁_方正飞翔6.0数字版注册机
  15. PN结/三极管/MOSFET理解
  16. KYLO的数据库知识总结
  17. 智能体:华为给时代炼一炉钢
  18. 农村创业年收入可以实现三五十万元?有哪些投资不大的项目
  19. 弘辽科技:淘宝客户流失率高怎么办?
  20. Mac系统关闭重启电脑后「重新打开应用及其窗口」功能的方法

热门文章

  1. 外汇交易:哪个货币对比较好做?
  2. 微软服务器2016各版本区别,Win10系统有几个版本?Windows10各版本区别详细介绍
  3. QT软件开发: 基于FFMPGE设计的流媒体播放器(rtmp/rtsp)
  4. 原函数与反函数的关系
  5. 丧钟为谁而鸣:AI步步逼近,华尔街23万人将失业
  6. 我是凡尘最美的莲花-记再读仓央嘉措
  7. 加强自定义菜单 即更换浏览器默认右击菜单栏
  8. android手机账号什么意思,苹果手机怎么改id账号 id账号是什么
  9. 三种摘要算法的简单介绍
  10. NLP自然语言处理-文本摘要简述