数学建模--蒙特卡罗法MATLAB代码保姆式解析

2024-04-19 03:12

本文主要是介绍数学建模--蒙特卡罗法MATLAB代码保姆式解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.简单介绍

2.思想的实际运用

我们利用蒙特卡罗法的思想求解圆周率π的值,这里求得的肯定是近似值,我们是通过大量的模拟实验,利用概率求解的,但是这个值和我们的精确值之间还是有一定的误差的;

我们的思想就是在半径为1的圆的外面做一个外切正方形,这个外切正方形的边长就是2,那么我们想要求的圆的面积π乘上半径的平方实际上就是乘以1的平方,也就是说圆的面积就是π,我们在这个正方形上面撒豆子,这个豆子可能会落在圆形里面,我们根据落在圆形里面的豆子数量占全部正方形里面的豆子的数量的比例,来计算这个圆形的面积,也就是我们的π,假设我们撒了10000颗豆子,有8000颗落在圆形里面,我们直接拿4*80%就是圆形的面积,也就是我们的π的近似值,这样的求解方法实际上就是蒙特卡罗法。前提是我们的实验的次数足够多,也就是说我们的豆子的数量应该足够多,这样进行实验得到的结论才具有普遍性,更有说服力。

3.MATLAB代码逐句分析

这个就是求解圆周率π需要用到的代码,我们分析一下:


(1)clc;clear是清除工作区的命令,这个命令我们已经很常见了,我们建议写上这句命令,这样就可以避免不必要的报错,因为在工作区里面可能我们前面定义的某一个变量和我们这个代码的变量会冲突,我们尽量使用这句话清除工作区的数据;


(2)p就是我们的实验进行的次数,通俗的讲就是我们的要撒的豆子的总量10000,这个数据比较大,结论具有普遍性;


(3)我们接下来使用for循环进行计数,这个里面的rand是一个函数,这个函数的作用就是生成随机数,随机数就可以具有普遍性,减少我们人为因素的影响,在其他的编程语言里面也会用到这个随机数的生成函数,例如我们熟知的扫雷游戏,这个游戏需要随机的布置地雷,这个时候就要设置地雷的坐标,这个地方也用到了rand函数,我们的MATLAB里面的rand函数默认的生成随机数字的范围是0~1,前面我们已经提及过,这个正方形的边长是2,我们让圆心的坐标是(1,1),所以我们让rand*2,这样的话生成的随机数的范围就是0~2之间(横坐标和纵坐标都在0~2之间),正好是落在我们的正方形区域里面;


(4)n表示这个时候落在圆形里面的豆子的数量,因为我们在进行参数的设置,这个时候还没有开始进行,相当于我们定义了一个变量n用来存储落在圆形里面的豆子数量,将来进行循环的时候,符合条件的在0的基础上面进行累加就可以了,这个n就相当于是一个计数器的角色;


(5)这个if语句是计算正方形里面的点到圆心的距离,如果距离小于半径的平方,说明这个循环产生的随机数在圆形里面,我们就是用n累加这个数;plot就是绘图指令,符合条件的和不符合条件的我们需要使用不同的标志进行绘图以方便区分;


(6)这个里面我们一共是进行了10000次循环,每次循环都会产生随机数,每次都会使用if语句进行判断,符合条件的话(豆子落在圆形区域里面),就让n加上1,然后绘制圆形里面的图,否则的话就绘制图圆形和正方形之间的图;plot里面的高亮部分就是一些plot函数的固定参数,我们了解即可,参数的最后一项就是图形颜色的设置,像我们这个里面用到的r表示的是红色,b表示的是蓝色;


(7)axis equal就是让我们的绘制出来的图形的横纵坐标轴的标度是一样的,这样的图像就会更加的美观,我在下面分别放了加上这句代码和不加这句代码的效果图,显然加上这个代码会更好;


(8)n/q就是我们的对应的概率,我们使用这个概率乘上正方形的面积4就是对应的圆形的面积,也就是我们想要计算的圆周率π,这个方法的本质就是概率;最后我们把s的值赋值给pi0,这样pio里面就是我们计算出来的圆周率的近似值;


(9)里面还有一行代码我们没有提到,就是这句hold on,这个代码到底是什么作用,我相信很多初学者都不是很清楚(我也是今天才知道);现在请你记住,这个代码的作用就是让我们每次循环的图像都在一个图像里面进行绘制,换言之,如果没这句代码,我们要进行10000次循环,每次循环都会产生新的窗口,这样的话我们无法进行观察,加上这句代码我们就可以让每次循环绘制的点在一个图里面,方便我们进行观察。


加上axis equal效果:


不加axis equal的效果:

这篇关于数学建模--蒙特卡罗法MATLAB代码保姆式解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916501

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认