【数学建模学习笔记】启发式算法:蒙特卡洛算法

蒙特卡洛模拟入门笔记:从原理到代码实践

一、什么是蒙特卡洛模拟?

蒙特卡洛模拟是一种通过大量随机实验来解决复杂问题的方法。简单说,就是用电脑模拟成千上万次随机事件,然后统计结果,以此估算一个问题的答案。

举个生活中的例子:想知道 "掷 100 次骰子,总和在 300 到 400 之间的概率",不需要真的掷 100 次骰子,而是用电脑模拟这个过程 10000 次,最后统计总和在 300-400 之间的次数占比 —— 这就是蒙特卡洛模拟的核心思路。

二、蒙特卡洛模拟的基本步骤

  1. 确定问题的范围(比如骰子的点数范围是 1-6)
  2. 生成大量随机样本(比如模拟掷 10000 次骰子)
  3. 计算每个样本的结果(比如每次掷骰子的总和)
  4. 统计分析结果(比如计算平均值、概率等)

三、用 Python 实现蒙特卡洛模拟

下面我们用一个简单的例子来实践蒙特卡洛模拟,目标是估算函数y = sin(x) + 0.5xx=0x=10范围内的平均输出值。

步骤 1:导入需要的工具库

首先需要导入两个常用的 Python 库:numpy用于数值计算和生成随机数,matplotlib用于画图展示结果。

# 导入工具库
import numpy as np  # 用于生成随机数和数学计算
import matplotlib.pyplot as plt  # 用于绘制结果图表

步骤 2:定义要模拟的函数

我们需要一个 "目标函数",这里选择简单的y = sin(x) + 0.5x(sin 是正弦函数,不用深究数学原理,只需要知道输入 x 会输出对应的 y 即可)。

# 定义目标函数:输入x,输出对应的y值
def target_function(x):return np.sin(x) + 0.5 * x  # 函数公式:y = sin(x) + 0.5x

步骤 3:编写蒙特卡洛模拟函数

这个函数的作用是:在指定范围内随机生成大量 x 值,计算对应的 y 值,然后把所有结果存起来。

def monte_carlo_simulation(func, min_x, max_x, num_samples):"""func:要模拟的函数min_x:x的最小值(范围起点)max_x:x的最大值(范围终点)num_samples:模拟次数(样本数量)"""results = []  # 用列表存储所有模拟结果# 重复num_samples次模拟for i in range(num_samples):# 生成一个在[min_x, max_x]之间的随机x值x = np.random.uniform(min_x, max_x)# 计算这个x对应的函数值yy = func(x)# 把结果存入列表results.append(y)# 打印进度(每完成10%显示一次)if (i + 1) % (num_samples // 10) == 0:print(f"已完成 {i + 1}/{num_samples} 次模拟")return results  # 返回所有模拟结果

步骤 4:设置参数并运行模拟

我们设定 x 的范围是 0 到 10,模拟 1000 次(可以自己修改次数看看效果)。

# 设置模拟参数
x_min = 0          # x的最小值
x_max = 10         # x的最大值
sample_count = 1000  # 模拟次数(样本数量)# 运行蒙特卡洛模拟
print("开始模拟...")
simulation_results = monte_carlo_simulation(func=target_function,min_x=x_min,max_x=x_max,num_samples=sample_count
)
print("模拟完成!")

运行后会看到进度提示:

开始模拟...
已完成 100/1000 次模拟
已完成 200/1000 次模拟
...
已完成 1000/1000 次模拟
模拟完成!

步骤 5:分析模拟结果

模拟得到大量 y 值后,我们可以计算它们的平均值(估算函数的平均输出)和方差(估算结果的波动程度)。

# 计算统计指标
mean_value = np.mean(simulation_results)  # 平均值(期望值)
variance_value = np.var(simulation_results)  # 方差(波动程度)# 打印结果
print(f"\n统计结果:")
print(f"函数的平均输出值:{mean_value:.2f}")  # .2f表示保留两位小数
print(f"结果的方差(波动):{variance_value:.2f}")

运行后会得到类似这样的结果:

统计结果:
函数的平均输出值:2.63
结果的方差(波动):2.32

步骤 6:可视化模拟结果

用直方图可以更直观地看到所有 y 值的分布情况(哪些 y 值出现得更多)。

# 绘制直方图
plt.figure(figsize=(10, 6))  # 设置图表大小
plt.hist(simulation_results,  # 要展示的数据bins=30,  # 柱子的数量(越多越精细)edgecolor='black',  # 柱子边缘颜色alpha=0.7  # 透明度(0-1)
)# 设置图表标题和坐标轴标签
plt.title('蒙特卡洛模拟结果分布', fontsize=15)
plt.xlabel('函数输出值(y)', fontsize=12)
plt.ylabel('出现次数', fontsize=12)
plt.grid(alpha=0.3)  # 显示网格线(alpha控制透明度)# 显示图表
plt.show()

运行后会看到一个直方图,横轴是函数的输出值 y,纵轴是这个 y 值出现的次数。从图中可以清晰地看到:大部分结果集中在 2-3 之间,和我们计算的平均值(2.63)一致。

四、尝试修改参数,观察变化

为了更好地理解蒙特卡洛模拟,可以尝试修改以下参数,看看结果会发生什么变化:

  1. 改变sample_count(比如改成 100 或 10000):模拟次数越多,结果通常越稳定。
  2. 调整x_minx_max(比如改成 0 到 20):x 的范围变了,函数的输出范围也会变化。
  3. 修改target_function(比如改成return x**2计算平方函数):不同的函数会有不同的结果分布。

五、总结

蒙特卡洛模拟的核心就是:用大量随机实验代替复杂计算。它不需要我们推导复杂的数学公式,只需要设定好范围,让电脑重复足够多次实验,就能估算出问题的答案。这种方法在金融、天气预测、游戏设计等很多领域都有广泛应用,掌握它能帮你解决很多看似复杂的问题!

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

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

相关文章

20250904的学习笔记

一、封包与拆包1. 封包(Packet Encapsulation)封包 是指在发送数据时,将数据从高层协议封装到低层协议的过程。每经过一层协议,数据都会被加上相应的协议头(有时也会加上协议尾),形成一个新的数…

STM32F4 + RT-Thread 实战指南:TIM10 硬件定时器驱动开发与 1 秒定时功能实现

目录前言一、STM32定时器10是个什么定时器?二、工程创建、环境配置三、程序代码四、运行前言 在rtthread中,STM32F4的定时器10有些驱动并不完整,对比与其它定时器在使用时需要手动的添加一些代码,我在使用上拆踩了一些坑&#xf…

echarts图库

环形图// 指定图表的配置项和数据this.option {// tooltip: {// trigger: item// },color: [#FFB32F, #FF5757, #57D5FF, #2FA8FF, #95FFF1], // 扇形区域以及列表颜色legend: {orient:vertical,//文字横向排itemGap:20,left: left,textStyle:{color: #F3F9FF,// fontSi…

进程(Process)全面概述

进程(Process)全面概述 本文档扩展了进程的定义、属性、生命周期、管理机制及示例,涵盖 task_struct 结构、进程链表、状态与优先级、fork 函数及其写时复制示例。 一、进程基本概念 进程:系统进行资源分配和调度的基本单位&#…

Java并发编程:sleep()与wait()核心区别详解

今天完成了实验室纳新网站的工作,大体功能都已经完善,也和前端测试过了,费了点时间,而且今天大部分时间在看langchain4j的东西,就简单复习一下八股,等会再复习一下算法题吧在Java并发编程中,sle…

AR眼镜在智能制造的应用方向和场景用例|阿法龙XR云平台

AR巡检在制造业的应用已形成覆盖设备维护、质量检测、安全监控和远程协作四大类别的成熟场景,不同制造领域的实践各具特色,为行业提供了宝贵参考。在汽车制造领域,AR 巡检主要应用于生产线设备维护和焊接质量检测。在汽车厂总装车间部署 AR 系…

【Linux系统】线程同步

在上一章节中,我们使用互斥量之后,确实解决了数据竞争问题,但出现了新的问题:只有一个线程(thread 1)在处理所有售票任务。这展示了互斥量的一个局限性:它确保了线程安全,但不保证公…

代码随想录训练营第三十一天|LeetCode56.合并区间、LeetCode738.单调递增的数字

56.合并区间 思路:先让二维数组进行排序; 遍历数组,定义一个min表示重合区间的左边界,max表示重合区间的右边界; 如果当前区间左边大于max,就证明重合区间断了,就要对它进行加入ArrayList&am…

【Unity项目经验分享】实现左右分屏裸眼3D程序

1、实现原理左右分屏原理,左右屏内容左右方向存在些许偏差。通过左右相机,然后左侧相机向左侧偏移一点3cm,右侧相机向右侧屏偏移一定3cm,然后将左右相机渲染内容通过RenderTexture渲染到Canvas上面的左右RawImage上面。2、实现具体…

设计软件启动失败?“找不到vcruntime140.dll,无法继续执行代码” 场景化解决方案来了

打游戏时,刚加载到登录界面就因 “找不到 vcruntime140.dll, 无法继续执行代码” 闪退;写代码时,编译工具突然报错中断工作;做设计时,PS、AE 启动失败弹出相同提示 —— 不同场景下的 vcruntime140.dll 错误&#xff0…

基于Echarts+HTML5可视化数据大屏展示-茶叶种植大数据溯源平台

效果展示&#xff1a;代码结构&#xff1a;主要代码实现 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta n…

PLOS One图片处理要求及处理办法

PLOS One图片处理&#xff1a; 要求&#xff1a;Please remove your figures from within your manuscript file, leaving only the individual TIFF/EPS image files. These will be automatically included in the reviewer’s PDF. 请从稿件文件中移除所有图表&#xff0c;…

AutoLayout与Masonry:简化iOS布局

Auto Layout 与 Masonry苹果提供的自动布局&#xff08;Auto Layout&#xff09;能够对视图进行灵活有效的布局。但是&#xff0c;使用原生的自动布局相关的语法创建约束的过程是非常冗长的&#xff0c;可读性也比较差。Masonry 的目标其实就是 为了解决原生自动布局语法冗长的…

从设计到落地:校园图书馆系统的面向对象实现全流程

很多小白学面向对象时总困惑&#xff1a;“类图、用例图我会画&#xff0c;但怎么把这些设计变成能跑的代码&#xff1f;” 这篇文章就用 “校园图书馆管理系统” 当例子&#xff0c;从需求分析→设计方案→代码实现→测试验证&#xff0c;带你走通 “设计→实现” 的完整链路&…

[鸿蒙心迹]带新人学鸿蒙的悲欢离合

2023年底&#xff0c;我和陆神&#xff0c;威哥&#xff0c;老罗一起去深圳参加了鸿蒙师资培训正式开启了鸿蒙之旅&#xff0c;当时和陆神拍的合照但是我把陆神打码了 学完以后就考取了鸿蒙的高级认证 看到没有时间是2023年11月 马上都要到期了。 想一想时间过得真快&#xff…

MindShow AI:AI思维导图生成工具高效解决思路混乱难题,快速搭建学习与工作大纲

你有没有过这种时候&#xff1f;想整理一份学习大纲或者项目方案&#xff0c;脑子裡一堆想法却散得像乱麻 —— 比如要做个 “数据分析入门规划”&#xff0c;明明知道要学 Excel、SQL、Python&#xff0c;可怎么分阶段、每个阶段学哪些重点&#xff0c;对着空白文档半天列不出…

快速搭建一个Vue+TS+Vite项目

1、在一个文件夹下通过cmd打开&#xff0c;输入命令npm create vitelatest命名要为英文2.选择项目框架通过上下键位选择Vue框架&#xff1a;选好按回车键3.选择开发语言选择TypeScript语言&#xff0c;方便后续开发&#xff1a;创建好的项目目录为&#xff1a;4.安装Vite依赖接…

深度学习:ResNet 残差神经网络详解

一、ResNet 残差神经网络的起源与核心地位ResNet&#xff08;Residual Neural Network&#xff0c;残差神经网络&#xff09;是 2015 年由微软亚洲研究院的何凯明、张祥雨等研究者提出的深度神经网络架构。在当年的 ImageNet 大规模视觉识别挑战赛&#xff08;ILSVRC&#xff0…

Python面试题及详细答案150道(116-125) -- 性能优化与调试篇

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 116. 如何查找Python程序的…

C++11 智能指针的使⽤及其原理

目录 1. 智能指针的使⽤场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使⽤ 4. 智能指针的原理 5. shared_ptr和weak_ptr 5.1 shared_ptr循环引⽤问题 5.2 weak_ptr 6. shared_ptr的线程安全问题 7. C11和boost中智能指针的关系 8. 内存泄漏 8.1 什么是…