用蒙特卡洛方法求解圆周率资料.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用蒙特卡洛方法求解圆周率 摘要:灵活运用C语言课程学习中的编程知识,编写能够在特定区域产生随机点的程序,结合数理相关原理根据蒙特卡罗思想,运用蒙特卡洛方法,从而运算圆周率 关键词:蒙特卡洛方法 圆周率 内容: 一、蒙特卡洛基本思想: 计算机模拟经常采用随机模拟方法或统计试验方法,这就是蒙特卡洛方法。它是通过不断产生随机数序列来模拟过程。自然界中有的过程本身就是随机的过程,物理现象中如粒子的衰变过程、粒子在介质中的输运过程…等。当然蒙特卡洛方法也可以借助概率模型来解决不直接具有随机性的确定性问题。 对求解问题本身就具有概率和统计性的情况,例如中子在介质中的传播,核衰变的过程等,我们可以直接使用直接蒙特卡洛模拟方法。该方法是按照实际问题所遵循的概率统计规律。直接蒙特卡洛方法最充分体现出蒙特卡洛方法无可比拟的特殊性和优越性,因而在物理学的各种各样的问题中得到广泛的应用。该方法也就是通常所说的“计算机实验”。 蒙特卡洛方法也可以人为地构造出一个合适的概率模型,依照对该模型进行大量的统计实验,使它的某些统计参量正好是待求问题的解。这也就是所谓的间接蒙特卡洛方法。我在这里求解圆周率就是用的间接蒙特卡洛方法。 二、圆周率求解的基本思想: 根据圆面积的求解公式s=πr2可推导出,圆周率的求解公式 π=s/r2,根据此公式,可知,只要计算出圆的面积,测得圆的半径即可求得圆周率。圆的半径可直接测得,但是圆的面积并不好求,传统的做法有微圆分 割法,如右图,将圆周无限分割成三角形这些三角 形都是等边的,可以通过求解三角形的面积间接求 得圆的面积,但是这样的圆周率并不精确。在本题 中采用计算机模拟来间接求得圆的面积,具体做法 如下: 如图,在水平光滑的桌面上画边长为2的正方形,一个单位圆(即半径为1的圆)与之相切,直角坐标系原点取单位圆的圆心,且二坐标轴与正方形平行。准备一张纸,上面分别写上两个标题:N圆和N正。在桌面的上方随便地投下缝衣针,每投下一次,就观察针尖落点的位置,如果针尖落到正方形内,在N正下加一条线; 如果针尖落到圆内,在N圆下加一条线, 落人正方形外时不记录。在多次投针后,就可以分别统计出针尖落人正方形或圆内的次数N正和N圆,用N圆除以N正然后乘以4就能得出圆周率。当重复投针实验到达几十万时,圆周率的值接近3.14或3.15#include iostream #include iomanip //setw函数,setprecision函数 #include time.h //time函数 #include stdlib.h //srand,rand函数 using namespace std; int main() { int dwCount; cout请输入打点的数目endl; cindwCount; //自己输入所要取的点数。 double j,k; double x,y; double m=0; for(int i=0;idwCount;i++) { j=(int)(20000.0*rand()/(RAND_MAX+0));//取从0到20000之间的随机数 k=(int)(20000.0*rand()/(RAND_MAX+0));//取从0到20000之间的随机数 x=j/10000; /*用刚才所取得随机数除以10000就是0到2之间的随机数,5位有效数字,代表横坐标*/ y=k/10000; /*用刚才所取得随机数除以10000就是0到2之间的随机数,5位有效数字,代表纵坐标*/ if(((x-1)*(x-1)+(y-1)*(y-1))=1) //判断所取得点是否在圆内 { m++; //如果这个所取得点在圆内,则计数器加1 } coutx yendl; /*输出所取得随机数,没有实际意义,只为了直观的看见所取得随机数*/ } coutmendl; double s=m/dwCount; //用圆内的点数除以所取得点数,得到一个比例 coutsendl; double t=4*s; /*用刚才的点数乘以4就是圆的面积,因为这里做了特殊,所以这个值也就是圆周率*/ couttendl; //输出圆周率 return 0; } 在vc6.0中调试好环境,运行程序,得到如下结果 (举例,输入点数为1000000): 结论:用蒙特卡洛方法求解圆周率影响精度的几个因素 a.所取得点数越多,得到的精度越高。 b.所取得随机数的精度越高,得到的圆周率的精度也就越高。 四、用平均打点的方法求解圆周率

文档评论(0)

0520 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档