找回密码
 注册
Simdroid-非首页
查看: 156|回复: 5

【原创】蒙特靠罗思想计算pi的大小[有代码]

[复制链接]
发表于 2010-11-11 16:10:29 | 显示全部楼层 |阅读模式 来自 江苏南京
本帖最后由 messenger 于 2010-11-12 17:28 编辑

我这只是蒙特卡洛思想的一个最基本的应用,写出来是为了熟悉matlab程序,让各位见笑了。

背景:如图所示,在单位正方形内随机产生N个点,这N个点落在单位正方形内接圆内的个数为n,则我们可知点落在圆内的概率为p=n/N。
理论分析中,我们可以知道落在圆内的概率是内接圆面积与单位正方形面积之比,即p=(pi*0.5^2)/1=pi/4
这两种计算概率的方法都是正确的,所以可得等式  n/N=pi/4  =>pi=4*(n/N)
我们得到了计算机计算pi的方法。


matlab实现程序如下:

count=0;                        %记录点在圆圈内的个数
x=rand(1,1000);                %生成x,y坐标
y=rand(1,1000);

for i=1:1000                %根据距圆心的距离检测点是否在圆圈内
        if sqrt((x(i)-0.5)^2+(y(i)-0.5)^2)<0.5                %圆心在0.5
                count=count+1;
        end
end

pi=4*count/1000

rectangle                        %画单位正方形
rectangle('Curvature', [1 1])                %画单位圆
axis equal                        %设置坐标轴等距
hold on
for i=1:100
        plot(x,y,'.')
end

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2010-11-11 17:03:55 | 显示全部楼层 来自 陕西西安
Simdroid开发平台
楼主加油!!积小流成江海啊!!

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-11-11 20:12:23 | 显示全部楼层 来自 浙江杭州
本帖最后由 pasuka 于 2010-11-11 20:37 编辑
  1. function varargout = compute_pi(varargin)
  2. % *************************************************************************
  3. % 使用蒙特卡洛方法计算圆周率
  4. % *************************************************************************
  5. % 程序输入输出说明:
  6. % 输入
  7. % -------------------------------------------------------------------------
  8. % 生成的单位方形区域内随机点的数量
  9. % 若没有输入,默认为1e4个随机点
  10. % -------------------------------------------------------------------------
  11. % 输出
  12. % 程序计算得到的圆周率
  13. % 计算结果和matlab内置圆周率的误差
  14. % -------------------------------------------------------------------------
  15. % 改进自baggio1987的代码
  16. % http://forum.simwe.com/thread-958188-1-1.html
  17. % by pasuka@simwe  11/11/2010

  18. % 判断输入的随机数的个数
  19. if isequal(nargin,1)
  20.     num = varargin{1};
  21. else
  22.     num = 1e4;
  23. end
  24. % 生成随机向量
  25. x1 = rand(num,1);
  26. x2 = rand(num,1);
  27. % 计算随机点到圆心的距离
  28. distance2 = (x1-0.5).^2+(x2-0.5).^2;
  29. % 找出单位圆内的点的个数
  30. % 增加一个无穷小量,预防出现在圆周上的情况
  31. count = length(find(distance2<=0.25 + eps));
  32. % 计算圆周率
  33. my_pi = 4*count/num;

  34. rectangle                        %画单位正方形
  35. rectangle('Curvature', [1 1])                %画单位圆
  36. axis equal                        %设置坐标轴等距
  37. hold on
  38. % 只绘制前1000个点,便于显示
  39. n2 = 1000;
  40. plot(x1(1:n2),x2(1:n2),'.');
  41. ss = ['\fontsize{16}蒙特卡洛方法计算得到的','{\fontsize{18}\color{red}','\pi}=' num2str(my_pi)];
  42. title(ss);
  43. % 输出结果与matlab内置圆周率的误差
  44. varargout = {my_pi,my_pi-pi};
  45. return
  46. end
复制代码
对lz的程序做了改进

评分

2

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-11-11 22:30:19 | 显示全部楼层 来自 河北廊坊
ls的程序写的好规范啊,写程序不注意的人可以学习一下。
回复 不支持

使用道具 举报

发表于 2010-11-11 23:52:06 | 显示全部楼层 来自 北京
确实写得很规范,值得学习~
回复 不支持

使用道具 举报

发表于 2017-7-19 02:28:49 | 显示全部楼层 来自 广东深圳
s的程序写的好规范啊,写程序不注意的人可以学习一下。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-25 23:31 , Processed in 0.038244 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表