数学建模--蒙特卡罗法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

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分