• 【Matlab】蒙特卡罗法模拟圆周率+对应解析的GIF生成【超详细的注释和解释】


    在这里插入图片描述


    前言

    因为博主最近要准备数学建模大赛了,在学习matlabpython之余,博主也会继续给大家输出博主的学习日记!
    今天是带来的是数学建模中的一个比较简单和基础的问题,圆周率的模拟。
    我们采用到的模拟方法是蒙特卡罗法。
    图片取自百度百科:
    在这里插入图片描述

    • 简单点来说就是随机在一个平面生成若干点,计算在单位圆内的点的个数,从而模拟出圆周率。

    那么这里博主先安利一下一些干货满满的专栏啦!

    数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
    算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
    力扣刷题专栏:Leetcode 想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
    C的深度解剖专栏:C语言的深度解剖 想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!


    模拟思路

    • 随机在一个平面生成若干点,计算在单位圆内的点的个数,从而模拟出圆周率。
    allPoints = 10000; % 我们设置生成的总点数越多,结果越逼近圆周率
    cnt=0;
    for i=1:allPoints
        if rand^2+rand^2<=1 % 这个点在四分之一圆内
            cnt=cnt+1; % 计数器加一
        end
    end
    res=cnt/allPoints*4; % 因为是四分之一圆,记得乘4
    disp(res);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    GIF模拟动图的生成

    在数学建模比赛中或者在日常数据分析中,用图的方式呈现结果,往往会让复杂的问题更清晰更明白的展示出来。

    GIF动图生成的基本思路

    • 基本思路:多张图片组合而成

    单张静态图的生成

    x1=linspace(0,1,10000); % 随机在[0,1]之间生成10000个点
    y1=(1-x1.^2).^0.5;   % 这个其实就是四分之一圆的方程
    
    x2=rand([1,500]);% 生成随机数的向量
    y2=rand([1,500]);
    
    % 先统计一下,有多少个点在四分之一圆里面 -- 因为我们要写标题
    count=0;
    for j=1:500
        % 注意:x2和y2都是一个数组
        if (x2(j)^2+y2(j)^2)<=1 % 点在四分之一圆里面的条件
            count=count+1;
        end
    end
    % plot(x1,y1,x2,y2);% 这样直接画其实不是散点的形式,所以要加一个参数'.'
    plot(x1,y1,x2,y2,'.');
    title(num2str(count)+"/"+num2str(500)+'*'+"4="+num2str(count/500*4));% 给图片设置标题
    axis square; % 可以让横纵坐标长度相同
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    图片的生成效果:
    在这里插入图片描述

    GIF的生成

    • 其实思路非常简单,我们直接使用一个循环,生成多张图,最后组合一下即可。
      生成GIF的代码:
        % 这段代码稍微可以记一下,是用来生成gif的
        frame = getframe(gcf); %捕获坐标区或图窗作为影片帧
        I = frame2im(frame); %返回与影片帧关联的图像数据
        [I,map]=rgb2ind(I,256);%将 RGB 图像转换为索引图像I,关联颜色图为 map
    
        if i == 500
            imwrite(I,map,'test.gif','gif', 'Loopcount',inf,'DelayTime',0.2);% 这里的0.2指的是,每幅图切换时候的时间间隔
        else
            imwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.2);
                         %                              append表示是图像时不断追加进去的
                         % test.gif这个文件会被放到默认的当前目录下
        end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    蒙特卡罗模拟圆周率GIF生成总代码:

    % 我们来绘制模拟圆周率当时的那张gif
    for i=[500,1000,2000,5000,10000]
        x1=linspace(0,1,10000);
        y1=(1-x1.^2).^0.5;
    
        x2=rand([1,i]);% 这些500都改成i
        y2=rand([1,i]);
    
        count=0;
        for j=1:i
            if (x2(j)^2+y2(j)^2)<=1
                count=count+1;
            end
        end
        plot(x1,y1,'black .',x2,y2,'.');
        title(num2str(count)+"/"+num2str(i)+'*'+"4="+num2str(count/i*4));
        axis square;
    
        % 这段代码稍微可以记一下,是用来生成gif的
        frame = getframe(gcf); %捕获坐标区或图窗作为影片帧
        I = frame2im(frame); %返回与影片帧关联的图像数据
        [I,map]=rgb2ind(I,256);%将 RGB 图像转换为索引图像I,关联颜色图为 map
    
        if i == 500
            imwrite(I,map,'test.gif','gif', 'Loopcount',inf,'DelayTime',0.2);
        else
            imwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.2);
                         %                              append表示是图像时不断追加进去的
                         % test.gif这个文件会被放到默认的当前目录下
        end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    生成效果:
    在这里插入图片描述

    尾声

    看到这里,相信我们已经学会蒙特卡罗法模拟圆周率的过程了,当然,这离数学建模的要求,离我们的目标还非常遥远,博主在不断学习的过程中,也希望可以通过分享学习日记的方式带动大家!如果你感觉这篇文章对你有帮助的话,不要忘了点赞!关注!收藏噢!

  • 相关阅读:
    跳槽涨薪技术之python+pytest接口自动化(6)-请求参数格式的确定
    YB4014是可以对单节磷酸铁锂电池进行恒流/恒压充电管理的集成电路。
    Docker的常用基础命令(详细讲解)
    IPO解读丨高处不胜寒,澜沧古茶低头取暖?
    架构师的 36 项修炼第06讲:架构核心技术之微服务
    async await使用同步方式写异步代码
    每日汇评:黄金形态确认牛市,再次尝试上行2000美元
    下载nvm管理node版本
    【目标检测】yolov7改进系列:添加CBAM注意力机制
    Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别
  • 原文地址:https://blog.csdn.net/Yu_Cblog/article/details/126132438