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
测试结果: