【学习笔记】蒙特卡洛仿真与matlab实现

概述

20 世纪 40 年代,由于电子计算机的出现, 借助计算机可以实现大量的随机抽样试验,为利用随机试验方法解决实际问题提供了便捷。 非常具代表性的例子是, 美国在第二次世界大战期间研制原子弹的“曼哈顿计划”中,为了解决核裂变物质的中子随机扩散问题,数学家冯•诺伊曼( Von Neumann)和乌拉姆( Stanislaw Marein Ulam)等人提出的随机模拟方法, 出于保密的缘故, 当时给这种方法起了一个代号叫蒙特卡洛。蒙特卡洛(Monte Carlo)本是摩纳哥的一个赌城的名字,用赌城的名字作为随机模拟方法的名称,既反映了该方法的部分内涵,又具有一定神秘性和便于记忆,因而很快就得到人们的普遍接受。 目前这一方法已经广泛地运用到了数学、物理、管理、生物遗传、社会科学等众多领域,并显示出了特殊
的优越性。
蒙特卡洛仿真定义:
蒙特卡洛仿真方法(MC)又称为随机取样法或统计模拟法, 它是以概率统计为理论基础并利用随机数的统计规律来进行计算和模拟的方法,通过大量的简单的重复抽样和计算来解决问题,它既可应用于数值计算,也可用于模拟仿真。

蒙特卡洛仿真与大数定理的关系:
蒙特卡洛仿真强烈依赖大数定理(频率会趋近于其理论概率,平均值趋近于理论期望值)。大数定理是蒙特卡洛方法有效性和收敛性的数学基石。它保证了通过生成大量独立同分布的随机样本并计算其均值,最终能够逼近难以直接计算的复杂期望值。没有大数定理,蒙特卡洛仿真就失去了其理论依据和可靠性保证。理解大数定理对于深入理解和正确应用蒙特卡洛方法至关重要。
蒙特卡洛仿真与MATLAB中rng函数的关系:

  • 蒙特卡洛仿真 是方法:依赖大量随机抽样来求解问题。
  • 伪随机数生成器 是工具:为蒙特卡洛仿真提供“随机”样本。
  • rng 是控制器:通过设置种子来控制伪随机数生成器的起始点。
  • 核心关联: rng 设置的种子直接决定了蒙特卡洛仿真中随机样本序列的起点,从而决定了仿真结果的可重复性(相同种子 => 相同结果)或可变性(不同种子/shuffle => 不同结果)。

下面是一些较为详细的介绍。

一、蒙特卡洛仿真是什么?

  • 核心思想: 利用随机抽样统计方法来解决复杂确定性问题或模拟随机系统行为的一种计算方法。它的名字来源于摩纳哥著名的赌城蒙特卡洛,象征着随机性和概率。
  • 基本原理:
    1. 定义问题: 明确你要解决的问题或模拟的系统。这个问题通常涉及不确定性或概率,或者可以用概率模型来近似。
    2. 构建概率模型: 为问题中涉及的随机变量或过程建立数学模型。例如,模拟股价变动可能需要基于几何布朗运动模型生成随机路径。
    3. 生成随机样本: 使用计算机的随机数生成器,根据定义的概率分布(如均匀分布、正态分布、泊松分布等)生成大量的随机数随机路径。这些随机数代表了模型中的不确定性。
    4. 执行模拟计算: 对生成的每一个随机样本(或一组样本),代入你的确定性模型或系统规则中进行计算,得到一个可能的结果观测值
    5. 统计分析: 收集所有模拟运行的结果。利用统计学方法(如计算平均值、方差、概率、置信区间、绘制直方图等)对这些结果进行分析,得到问题的近似解或系统行为的统计特性(如期望值、风险概率、系统性能指标等)。
  • 关键特点:
    • 基于随机性: 核心是生成大量随机样本。
    • 数值方法: 提供的是数值解而非解析解。
    • 大数定律: 模拟次数越多(样本量越大),统计结果通常越接近理论值或真实情况(收敛性)。
    • 处理复杂问题: 特别擅长解决高维度、多变量、非线性、路径依赖等难以用传统解析方法求解的复杂问题。
    • 应用广泛: 金融工程(期权定价、风险评估)、物理模拟(粒子输运)、工程可靠性分析、供应链优化、机器学习(集成方法如随机森林)、计算生物学等。
  • 简单例子: 估算圆周率 π。在单位正方形内随机投点,计算落在内切圆内的点所占比例。这个比例乘以 4 就是 π 的蒙特卡洛估计值。投点次数越多,估计越准。这里,点的坐标就是随机样本。

二、蒙特卡洛仿真与 MATLAB 中 rng 的关联

蒙特卡洛仿真的核心步骤是生成随机样本。在 MATLAB(以及其他编程语言/软件)中,计算机本身无法产生真正的随机数,而是生成伪随机数

  • 伪随机数: 通过一个确定的数学算法(伪随机数生成器 - PRNG)从一个初始值(称为种子)开始计算出来的一系列数字。这些数字看起来是随机的(满足统计上的随机性检验),并且具有可重复性。
  • rng 函数的作用: MATLAB 的 rng 函数就是用来控制伪随机数生成器的状态,其核心功能之一就是设置种子
    • rng(seed): 将随机数生成器的种子设置为一个特定的非负整数 seed(例如 rng(42))。
    • rng('shuffle'): 根据当前时间(通常是时钟)设置种子,使得每次运行程序时种子不同。
    • rng('default'): 将生成器重置回 MATLAB 启动时的默认设置(包括默认种子和算法)。
    • s = rng: 获取当前随机数生成器的状态(一个包含种子、算法等信息的结构体)。
    • rng(s): 将随机数生成器恢复到之前保存的状态 s
  • rng 与蒙特卡洛仿真的关键关联:
    1. 结果可重复性: 这是最重要的关联!设置相同的种子 (rng(seed)) 可以确保每次运行你的蒙特卡洛仿真程序时,生成的随机数序列是完全相同的。这对于以下情况至关重要:
      • 调试: 当程序出错时,固定种子可以让你在完全相同的输入(随机数)条件下重现错误,便于定位问题。
      • 算法验证/比较: 比较不同算法或参数在同一组随机输入下的表现,确保比较的公平性。
      • 结果复现: 发表论文或分享代码时,让其他人能够精确复现你的仿真结果。
      • 确定性测试: 在开发阶段,有时需要暂时消除随机性以测试逻辑流程。
    2. 结果可变性: 如果你不设置种子使用 rng('shuffle'),那么每次运行程序都会产生不同的随机数序列,从而导致蒙特卡洛仿真的结果(如均值、方差、概率估计)也会略有不同。这代表了仿真中固有的随机性。多次运行(不同种子)的结果可以用来评估仿真结果本身的波动性(即蒙特卡洛误差)。
    3. 控制随机源: rng 设置的是全局随机数流的起点。之后调用 rand, randn, randi 等函数生成的各种分布(均匀、正态、离散均匀等)的随机数,其序列都取决于这个初始种子。确保整个仿真使用的所有随机数都源于同一个可控的起点。

总结两者的关系

  • 蒙特卡洛仿真 是方法:依赖大量随机抽样来求解问题。
  • 伪随机数生成器 是工具:为蒙特卡洛仿真提供“随机”样本。
  • rng 是控制器:通过设置种子来控制伪随机数生成器的起始点。
  • 核心关联: rng 设置的种子直接决定了蒙特卡洛仿真中随机样本序列的起点,从而决定了仿真结果的可重复性(相同种子 => 相同结果)或可变性(不同种子/shuffle => 不同结果)。

MATLAB 代码示例说明关联

% 情形 1: 固定种子 - 结果可重复
rng(123); % 设置种子为 123
results1 = run_monte_carlo_simulation(1000); % 运行1000次模拟
% ... 稍后,再次运行 ...
rng(123); % 再次设置相同的种子
results2 = run_monte_carlo_simulation(1000); % results2 应该完全等于 results1% 情形 2: 不固定种子 (或使用 rng('shuffle')) - 结果通常不同
% rng('shuffle'); % 如果用这行,每次种子都不同
resultsA = run_monte_carlo_simulation(1000);
resultsB = run_monte_carlo_simulation(1000); % resultsB 很可能不同于 resultsA

在这个例子中,run_monte_carlo_simulation 函数内部会多次调用 rand, randn 等函数来生成随机输入。rng(123) 确保了这两次调用该函数时,rand, randn 等函数产生的序列是完全相同的,因此 results1results2 必然相同。如果没有 rng(123),或者使用了 rng('shuffle'),那么每次调用 run_monte_carlo_simulation 时生成的随机序列不同,导致 resultsAresultsB 不同。

因此,在编写和运行蒙特卡洛仿真程序时,明智地使用 rng 来控制随机数种子是保证结果科学性和可管理性的关键一步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88308.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP/3.x协议详解:基于QUIC的下一代Web传输协议

一、HTTP/3协议概述 HTTP/3是超文本传输协议(HTTP)的第三个正式版本,由IETF(互联网工程任务组)于2022年正式标准化(RFC 9114)。其核心创新在于完全基于QUIC协议替代传统TCP,结合UDP…

【SQL】使用UPDATE修改表字段的时候,遇到1054 或者1064的问题怎么办?

我在使用python连接sql修改表格的时间字段的时候,遇到这样一个问题:ProgrammingError: (pymysql.err.ProgrammingError) (1064, “You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the ri…

【字节跳动】数据挖掘面试题0013:怎么做男女二分类问题, 从抖音 app 提供的内容中。

文章大纲 🔍 一、问题定义与数据基础数据源及预处理:⚙️ 二、特征工程方案1. 文本特征2. 视觉特征3. 音频与行为特征4. 上下文特征🤖 三、模型选型与训练1. 基础模型对比2. 多模态融合模型3. 训练技巧📊 四、评估与优化策略1. 评估指标2. 典型问题优化3. 算法偏差控制�…

HTTP请求走私漏洞

一、漏洞定义与核心原理HTTP请求走私(HTTP Request Smuggling)是一种利用前端服务器(如代理、负载均衡器)与后端服务器在解析HTTP请求时的不一致性,绕过安全机制并执行恶意操作的攻击技术。其核心在于混淆请求边界&…

Javaweb - 10.1 Servlet

目录 Servlet 简介 动态资源和静态资源 Servlet 简介 Servlet 开发流程 目标 开发过程 开发一个 web 类型的 module 开发一个 form 表单 开发一个 UserServlet 在 web..xml 为 userServlet 配置请求路径 Edit Configurations 启动项目 完! Servlet 简介…

手机能用酒精擦吗?

对于电视、电脑屏幕来说,为了避免反光、改善显示效果,会在屏幕表面覆上一层“抗反射涂层”。不同厂商设计的涂层材料并不相同,酒精作为良好的溶剂,确实会损坏可溶的涂层。手机作为触控产品,通常会在屏幕表面增加“疏水…

【图像处理基石】图像超分辨率有哪些研究进展值得关注?

近年来,图像超分辨率(SR)领域在深度学习技术的推动下取得了显著进展,尤其在模型架构优化、计算效率提升和真实场景适应性等方面涌现出诸多创新。以下是基于最新研究的核心进展梳理: 一、高效大图像处理:像素…

Windows系统下WSL从C盘迁移方案

原因:一开始装WSL的时候放在了C盘,这下好了,跑了几个深度学习模型训练后,C盘快满了,这可怎么办?可愁坏了。没关系,山人自有妙计。我们将WSL迁移到D盘或者E盘呀。一.迁移操作步骤前期准备&#x…

金融时间序列机器学习训练前的数据格式验证系统设计与实现

金融时间序列机器学习训练前的数据格式验证系统设计与实现 前言 在机器学习项目中,数据质量是决定模型成功的关键因素。特别是在金融时间序列分析领域,原始数据往往需要经过复杂的预处理才能用于模型训练。本文将详细介绍一个完整的数据格式验证系统&…

cocos2dx3.x项目升级到xcode15以上的iconv与duplicate symbols报错问题

cocos2dx3.x项目升级xcode15以上后会有几处报错。1. CCFontAtlas.cpp文件下的iconv与iconv_close的报错。修改如下:// iconv_close(_iconv);iconv_close((iconv_t)_iconv);iconv((iconv_t)_iconv, (char**)&pin, &inLen, &pout, &outLen); /…

HTTP/3.0的连接迁移使用连接ID来标识连接为什么可以做到连接不会中断

一定要结合图文一起理解!! 文章目录文字描述传统方式:HTTP/2 基于 TCP 的连接(就像打固定电话)HTTP/3 基于 QUIC 的连接迁移(就像用带“通话ID”的手机)总结一下图文详解HTTP2.0传统方式&#x…

让工作效率翻倍的终极神器之被工具定义的编程时代(VS Code + GitHub Copilot + JetBrains全家桶)

目录一、引言:被工具定义的编程时代二、背景:传统开发模式的效率瓶颈2.1 认知负荷过载2.2 工具链断层三、效率翻倍工具链深度解析3.1 智能代码编辑器:从打字机到智能助手3.2 版本控制大师:Git的隐藏技能3.3 自动化脚本&#xff1a…

docker部署单机gitlab

环境准备: 证书: acme.sh --issue --dns dns_ali -d gitlab.chandz.com -d *.chandz.comcp /root/.acme.sh/gitlab.chandz.com_ecc/* /data/docker-data-volume/gitlab/ssl/目录: mkdir -p /data/docker-data-volume/gitlab cd /data/docker-…

【K8S】在 Kubernetes 上配置安装 Nginx Ingress 控制器指南

文章目录架构概览先决条件部署方案选择方案一:手动 YAML 部署核心组件详解方案二:Helm快速部署(生产推荐)验证部署DNS配置策略方案A:单域名映射方案B:通配符映射(推荐)应用实战&…

SHA-256算法详解——Github工程结合示例和动画演示

近日笔者在学习区块链的相关知识,接触到SHA-256算法,这里做一个知识梳理和总结。 强烈推荐大家自行去学习下面链接github上的工程,作者的动画演示和解释做的非常出色,逻辑非常清晰,B站搬运的对应的油管的讲解视频也放…

C语言模块化编程思维以及直流电机控制(第四天)

👨‍💻个人主页:开发者-削好皮的Pineapple! 👨‍💻 hello 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 削好皮的Pineapple! 原创 👨‍&#x1f4…

【PTA】数据结构与算法0001:1025 反转链表

文章大纲写在前面测试用例ac代码学习代码知识点小结写在前面 实现思路 结构体封装数据 根据order重新排序k区间值迭代翻转 n整除k,则最后地址输出"-1"非整除,最后剩余区间,原序输出。最后地址输出"-1" 题目有难度&…

深入解析 .NET 泛型:从原理到实战优化

在现代软件开发中,代码复用性和性能优化是开发者永恒的追求。.NET 泛型作为一项强大的语言特性,不仅能够帮助我们消除重复代码,还能显著提升代码的类型安全性和运行效率。本文将带你全面了解 .NET 泛型,从基本概念到高级用法&…

Excel 处理软件 内容复制工具:工作表批量复制 + 合并拆分简洁操作零门槛

各位办公小能手们!今天给你们介绍一款超牛的软件——Excel内容复制工具。软件下载地址安装包 这可是专门为了让Excel数据处理效率蹭蹭往上涨而设计的辅助软件呢!它的主要功能可多啦,能批量复制工作表,还能把好多表格合并到同一个…

【机器学习实战笔记 14】集成学习:XGBoost算法(一) 原理简介与快速应用

《XGBoost算法》 推荐的学习路径: 【快速实现XGBoost、跑通代码】- 第一部分 【快速掌握XGBoost应用、达到自由调参水平】- 第一部分~第三部分 【快速掌握XGBoost原理、面试得以通关】- 第一部分1 第二部分1.2、2.2 第四部分 目录《XGBoost算法》一 XGBoost的基…