本帖最后由 TS-boys 于 2020-11-12 16:10 编辑

1.引子

取整是常用的运算,结合一些背景就可以做很多好玩的事情,例如模拟投针实验计算圆周率。部分内容用到了之前分享过的:

2.取整

在MATLAB中索引是常见操作,如果A是一个矩阵,那么A(1)就是取出矩阵A的第一个元素,所以A(1.0000001)呢?会报错!因为索引必须是整数。而同时,double的计算又存在精度问题,很有可能我们写了个n=的式子,应该算出来结果是1,却变成了1.0000001,这时再用A(n)来索引,就出错了。

如果翻看论坛的帖子,会发现这个报错并不少见,而一般推荐的解决办法是用A(round(n)),这里的round就是一种取整,其具体的逻辑是近似到最接近的整数。需要注意的是,取整操作后的结果依然是double类型的变量,如果需要改变变量类型,应该用类似 int8(n) 这样的命令。

MATLAB中常见的取整函数包括:

2.1 round

向最接近的整数取整,例如3.1会变成3,-3.2会变成-3。不要尝试round(1.5)这样的数,实际过程远比四舍五入要复杂,各种x.5的结果可能会不同

2.2 floor

向负无穷方向取整。所以-3.2会变成-4。可以用来计算“商与余数”,例如floor(17/12)就会显示商的结果

2.3 ceil

向正无穷方向取整。所以3.1会变成4。与floor是完全相反的方向,利用这个特性,如果一个数的floor和ceil相等,说明什么呢?说明这个数本身就是整数!例如floor(3)和ceil(3)的结果是相同的,就说明3是整数。当然,实际中,除非炫技,我们一般不会这样去做。

2.4 fix

向0的方向取整。对正数而言,相当于floor,对负数而言,相当于ceil。

2.5 round

取最接近的整数,也是最常用的取整,通常用来消除double计算导致的误差。

3.例子

3.1背景

从百度百科看到:

p1.PNG (20.89 KB, 下载次数: 12)

2020-11-12 16:04 上传

进一步,可以假设一些数学变量

p2.png (8.84 KB, 下载次数: 15)

2020-11-12 16:04 上传

其中,黑色的是平行线,距离为a,红色的是针,长度L。

针的中点y坐标为c,针的倾斜角度为arg,这样针的两个端点的坐标y1和y2就可以写成c和arg以及L的函数了。而判断针和平行线是否相交,就是判断y1和y2之间有没有平行线,也就是判断y1/a和y2/a是否拥有相同的整数部分。而拥有相同的整数部分,就是向负无穷取整相同,即floor结果相同。

3.2建立class

p3.png (17.44 KB, 下载次数: 15)

2020-11-12 16:04 上传

这里基于面向对象编程的思路,一次实验中的决定参数为a、L、c和arg,这四个参数决定了平行线和针的所有情况,有点像控制算法中的状态变量,即这四个数决定了所有其他的变量,在面向对象编程时,这四个数就是属性properties。

有了属性就可以写方法,第一个方法就是构造器,a和L作为输入变量,c和arg作为随机生成的结果,就构造了一次投针。

第二个方法是检查是否和平行线相交,具体做法就是对y1和y2做floor,看结果是否一致。

第三个方法是重新投针,此时a和L已经不能改变,只对c和arg进行一次随机。这个方法的目的仅仅是为了今后编程,也可以没有这个方法。此时重新投针就相当于用第一个方法重新构造一根新的针。

3.3概率计算

p4.png (11.28 KB, 下载次数: 15)

2020-11-12 16:04 上传

假设我们一共进行n次投针,那么每次投针后,我们会有一个“当前相交总数”的量,将这个量记为m(i),其中i是1到n。假设我们已经投针50次,那么m(50)就是前50次中,出现针与平行线相交的次数总和。如果我们计划投针100次,那么从m(1)/1, m(2)/2一直到m(100)/100应该能看到这个概率逐渐趋于稳定。

具体的代码中,通过构造器进行第一次投针,通过“重新投针”方法re进行后续的投针。每次投针后,通过“检查是否和平行线相交”方法check进行检查,并根据检查结果在m(i-1)的基础上计算m(i),最后计算概率p

3.4使用例子

myclass.m

(722 Bytes, 下载次数: 3)

2020-11-12 16:08 上传

点击文件名下载附件

try1.m

(456 Bytes, 下载次数: 2)

2020-11-12 16:08 上传

点击文件名下载附件

直接运行try1.m即可,经过10万次投针后,结果已经很接近圆周率了。

p5.PNG (20.69 KB, 下载次数: 17)

2020-11-12 16:04 上传

4.扩展

在try1.m中还用到了一些其他的特性:

4.1计时器

MATLAB提供了多种计时方式,其中最简单的是tic和toc命令,这样可以查看整个程序的运行时间,从而比较不同代码的速度

4.2 arrayfun

这是一个使用很灵活的函数,大概的意思是对一列相同类型的变量,进行相同的操作。例如我们进行实例化多个投针,然后对每个投针进行check。这里多个投针可以组成一列变量,而check就是相同的操作。

matlab rand求圆周率,MATLAB做投针实验求圆周率相关推荐

  1. 利用蒲丰投针实验求π/c语言

    //dsd的概率论大作业 平面上画着两条间距a的平行线,随机地向此平面任投掷一长度为l ( l < a )的针N次,观察针与直线相交的次数记为n,计算此针与直线相交的概率. 以x表示针的中点距离 ...

  2. 一文读懂蒲丰投针实验

    这个博客源于概率论复习期间,蒙特卡罗方法的思想起源,这种求π\piπ的思路非常的巧妙 附:历史上用蒲丰投针实验估计圆周率的实验记录,来源 蒲丰投针 蒲丰投针实验是法国数学家.自然科学家"乔治 ...

  3. Buffon's Needle An Analysis and Simulation------蒙特卡洛法模拟蒲丰(Buffon)投针实验-使用Matlab

    Buffon's Needle An Analysis and Simulation 蒲丰投针实验是一个著名的概率实验,其原理请参见此页: http://www.mste.uiuc.edu/reese ...

  4. Matlab模拟蒲丰投针实验计算Π值

    文章目录 1.前言 2.实验目的 3.实验原理 (1)问题描述 (2)问题求解 4.实验过程 5.实验结果 6.实验结论 7.Matlab代码 1.前言 学习了概率论,决定自己动手编程实现蒲丰投针实验 ...

  5. 布丰投针java实现,MATLAB模拟布丰投针实验

    MATLAB模拟布丰投针实验 标签(空格分隔): 算法 Buffon's Needle 桌面上有距离为a的若干平行线,将长度为L的针随机丢在桌面上,则这根针与平行线相交的概率是多少?假定L < ...

  6. MATLAB模拟布丰投针实验

    MATLAB模拟布丰投针实验 标签(空格分隔): 算法 Buffon's Needle 桌面上有距离为a的若干平行线,将长度为L的针随机丢在桌面上,则这根针与平行线相交的概率是多少?假定L < ...

  7. 蒲丰投针实验原理_布丰投针实验 MATLAB仿真 以及报告

    布丰投针实验原理.仿真过程以及 MATLAB仿真代码.完整的布丰投针实验报告. 以下内容无关: -------------------------------------------分割线------ ...

  8. 用一根线模拟浦丰投针实验——Java

    用一根线模拟浦丰投针实验--Java 浦丰投针实验(Buffon's needle problem)   本文先给出正确的推理过程,错误的推导过程放在文章末尾,方便大家探讨.   不多废话,直奔主题. ...

  9. 蒲丰投针计算机模拟ppt,蒲丰投针实验模课件.doc

    概率论与数理统计实验 蒲丰投针与蒙特卡罗法 班级 应数12级01班 学号 2012444086 姓名 张旭东 蒲丰投针与蒙特卡罗法 张旭东 2012444086 (重庆科技学院 数学与应用数学 ,重庆 ...

  10. Buffon投针实验

    Buffon's Needle 桌面上有距离为a的若干平行线,将长度为L的针随机丢在桌面上,则这根针与平行线相交的概率是多少?假定L < a.  思路:从针据横线的距离与夹角得出.  解决:  ...

最新文章

  1. ATS 6.2.1中缓存文件过期并不回源校验的“坑”
  2. 人工智能的学习,需要学习哪些算法和数学知识呢?需要什么学历?
  3. 一起谈.NET技术,也玩MVC3.0 Razor自定义视图引擎来修改默认的Views目录结构
  4. 【Python学习系列十二】Python库pandas之CSV导入
  5. 户外私密Party| 在大峡谷中聊点平时不能聊的产品干货(报名结束)
  6. C语言在建筑专业的应用,新工科背景下基于OBE的《C语言程序设计》课程建设
  7. (转)双系统卸载Ubuntu
  8. 使用Roslyn脚本化C#代码,C#动态脚本实现方案
  9. Lock的lockInterruptibly()
  10. Javascript编程技巧 -- 函数记忆
  11. 《天天数学》连载44:二月十三日
  12. 计算机工作操作中一些问题,计算机二级考试中操作题常见问题之[电子表格]
  13. Linux磁盘分区/格式化/挂载目录
  14. HDU2066一个人的旅行(dijkstra)
  15. 架构实战项目心得(一):技术和工具
  16. Java实现微信轰炸
  17. 树莓派挂载硬盘/U盘以及分区教程
  18. 信息安全毕设论文选题推荐
  19. Bandicam班迪录屏 高清录制视频软件
  20. mysql更改date为ym_关于日期格式设置及转换

热门文章

  1. java 拼音模糊查询_java 编写模糊查询
  2. IDEA中使用SVN IDEA配置SVN步骤
  3. java实现分页序号问题_java 分页查询的实现
  4. 程序员面试题!亲身经历!持续更新!
  5. 董付国python题库_1000道Python题库系列分享四(40道)
  6. inode客户端linux 怎样运行,H3C_iNode智能客户端安装指导(Linux)
  7. sas不能安装独立的java_sas安装问题java platform standard edition runtime environment
  8. 深度学习中的优化算法之Adadelta
  9. java 同步操作降低效率解惑
  10. java cximage_图像处理库比较 OpenCV CxImage ImageMagick CImg FreeImage