Matlab蒙特卡洛模拟PI值

Matlab蒙特卡洛模拟PI值

前言

刚写了个Matlab的蒙特卡洛模拟的作业,顺便把代码放上来,希望能对谁有帮助。。。

主体类MonterCarlo.m:

classdef MonteCarlo < handle
    %MonteCarlo 使用蒙特卡洛模拟模拟PI的值
    
    properties (Access = private)
        Times;  % 重复实验次数
        R = 1;  % 默认模拟圆的大小,类内初始化
        Center = [1,1]; % 圆心坐标
        count = 0;  % 模拟中在圆内的点的数量
    end
    
    methods (Access = private)
        % 给定一点,判断是否在圆内
        function ret = isInCircle(MC, pos)
           ret = norm(pos - MC.Center) <= MC.R;
        end
        
        % 画出圆和矩形
        function draw(MC)
           % 画出圆
           theta = linspace(0,2 * pi);
           x = MC.R * cos(theta) + MC.Center(1);
           y = MC.R * sin(theta) + MC.Center(2);
           plot(x,y);
           
           % 画出矩形
           rectangle('Position',[MC.Center(1) - MC.R, MC.Center(2) - MC.R, 2 * MC.R, 2 * MC.R]);
           
           % 更改坐标轴范围
           axis equal;
           axis([0, 2 * MC.R, 0, 2 * MC.R]);
           hold on; % 在这基础上描点
        end
        
        function work(MC) 
           format long;
           % 在圆内的点集
           inCirX = [];
           inCirY = [];
           
           % 在圆外的点集
           outCirX = [];
           outCirY = [];
           
           for i = 1:MC.Times
               % 随机产生一个坐标
               pos = rand(1, 2) * (2 * MC.R);
               if MC.isInCircle(pos)
                   MC.count = MC.count + 1;
                   inCirX(end + 1) = pos(1);
                   inCirY(end + 1) = pos(2);
               else
                   outCirX(end + 1) = pos(1);
                   outCirY(end + 1) = pos(2);
               end
           end
           % 描点
           scatter(inCirX, inCirY, 'b.');     % 将在圆内的点描蓝
           scatter(outCirX, outCirY, 'r.');   % 将在圆外的点描红
           % 打印模拟结果
           sprintf('本次总共随机生成 %d 个点, 其中 %d 个在圆内,%d 个在圆外,模拟的PI值为 %g\n',...
               MC.Times, MC.count, MC.Times - MC.count, MC.count / MC.Times * 4 * MC.R ^ 2)
        end
    end
    
    methods
        function MC = MonteCarlo(Times)
            MC.Times = Times;
            MC.draw();
            
            % 设置随机数生成器
            rng('shuffle');
            MC.work();
            hold off;   % 将hold置为初始情况,防止画被覆盖。
        end
    end
end

测试结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值