基于MATLAB,使用蒙特卡洛法进行Pi值的估算

Pi值的估算

估算方法:蒙特卡洛法

实验原理:

估算模型:

在边长为2的正方形内随机生成点,用随机掉落在半径为1的圆内点数,除以掉落在其外接正方形内点数,来近似估算pi。

以下是随机生成点数为10000,20000,30000。其pi的估值分别为3.1872 ,3.1354 ,3.1455。

实验次数N与绝对误差的关系(近似为正态分布)

一次随机实验中,点落在圆内的概率为p=pi/4。n为实验次数,置信度至少为95%(pi_alpha=0.05),则绝对误差公式:delta=sqrt((2*p*(1-p))/(n*erf(1-alpha)^2))以,实验次数从10000到10000000每次实验次数增加10000次时,绝对误差和实验次数的图像。

这个图像表明随实验次数N求得的pi的均值,符合正态分布。

以下该图像为实验次数N增大,同时设定样本数也为N,发现其也符合正态分布,猜测原因是,在实验次数增加时,p趋近真实值,符合大数定理,则p接近Ep,与求样本的均值分布都满足正态分布。

完整代码

clear all
close all
%参数
N=10000:10000:10000000;
numbber=1000;
numbberx=1:numbber;
N_length=length(N);
Circle_X=1;
Circle_Y=1;
Circle_R=1;
Rectangle_X=2;
Rectangle_Y=2;
Estimate_pi_sample=[];
alpha=0.05;
p=pi/4;
delta_y=[];
Estimate_pi_sample_sum=[];
%画圆
for i=1:numbber
    theta=0:pi/20:2*pi;
    Trajectory_Circle_X=1+cos(theta);
    Trajectory_Circle_Y=1+sin(theta);
%     subplot(3,1,i);
%     plot(Trajectory_Circle_X,Trajectory_Circle_Y);
%     hold on;
    %绘制点
    Point_Incircle=0;
    for n=1:numbber
        Random_Point_X=2*rand;
        Random_Point_Y=2*rand;
        if (Random_Point_X-1)^2+(Random_Point_Y-1)^2<1
             Point_Incircle=Point_Incircle+1;
%             plot(Random_Point_X,Random_Point_Y,'.','Color',[0,0,1]);
%         else
%             plot(Random_Point_X,Random_Point_Y,'.','Color',[1,0,0]);
        end
    end
    %估算pi
    Estimate_pi=(Point_Incircle/numbber)*4;
    Estimate_pi_sample=[Estimate_pi_sample Estimate_pi];
    %pi均值
    Estimate_pi_sample_sum=[Estimate_pi_sample_sum sum(Estimate_pi_sample)/i];

end
%验证大数定理验证,当n增大时,当N越大时,Estimate_pi越接近pi,绝对误差近似正态分布
%验证大数定理验证,当n确定时,当N越大时,Estimate_pi越接近pi,绝对误差近似正态分布
for i=1:length(N)
    delta=sqrt((2*p*(1-p))/(N(i)*erfinv(1-alpha)^2));
    delta_y=[delta_y delta];
end
subplot(211)
plot(N,delta_y)
xlabel('实验次数N');
ylabel('理论绝对误差delta');
title('实验次数和理论绝对误差的关系');
subplot(212)
plot(numbberx,abs(Estimate_pi_sample_sum-pi))
xlabel('实验次数N');
ylabel('实际绝对误差delta');
title('实验次数和实际绝对误差的关系');

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值