《王洪彬蒙特卡洛MonteCarlo.ppt》由会员分享,可在线阅读,更多相关《王洪彬蒙特卡洛MonteCarlo.ppt(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、王洪彬蒙特卡洛MonteCarlo Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望蒙特卡洛法是什么?蒙特卡洛法是什么?蒙特卡洛蒙特卡洛(Monte Carlo)方法,或称计算机随机方法,或称计算机随机模拟方法,是一种基于模拟方法,是一种基于“随机数随机数”的计算方法。的计算方法。这一方法源于美国在第二次世界大战中研制原这一方法源于美国在第二次世界大战中研制原子弹的子弹的“曼哈顿计划曼哈顿计划”。该计划的主持人之一、。该计划的主持人之一、数学家冯数学家冯诺伊曼用驰名
2、世界的赌城诺伊曼用驰名世界的赌城摩纳哥摩纳哥的的Monte Carlo来命名这种方法,为它蒙上来命名这种方法,为它蒙上了一层神秘色彩。了一层神秘色彩。MonteCarlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件产生的“频率”来近似事件的“概率”。19世纪人们用投针试验的方法来决定圆周率。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?MonteCarlo方法是这样一种“随机化”的方法:向
3、该正方形“随机地”投掷N个点,若有M个点落于“图形”内,则该“图形”的面积近似为M/N。圆周率的值=3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190
4、914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217
5、98609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713.用该方法计算的基本思路是:1根据圆面积的公式:s=R2,当R=1时,S=。由于圆的方程是:x2+y2=1(x2为x的平方的意思),因此1/4圆面积为x轴、y轴和上述方程所包围的部分。如果在1*1的正方形中
6、均匀地落入随机点,则落入1/4圆中的点的概率就是1/4圆的面积。其4倍,就是圆面积。由于半径为1,该面积的值为的值。#include#include#includeconstlongN=2000000000;/*定义随机点数*/voidmain()intn=0;doublex,y;/*坐标*/srand(time(00);for(inti=1;i=N;i+)x=(double)rand()/RAND_MAX;y=(double)rand()/RAND_MAX;/*在01之间产生一个随机x,y坐标*/if(x*x+y*y=1.0)n+;/*统计落入单位圆中的点数*/coutThePIis4*(d
7、ouble)n/Nendl;/*计算出的值*/计算机模拟实验数据处理计算机模拟实验数据处理1234513.1415333.1415193.1415273.1415363.14152923.1415283.1415283.1415093.1415533.14150633.1415273.1415213.1415373.1415273.1415380.0000120.00000323.14152790.000003314实验简评实验简评由实验结果知由实验结果知此结果与我们前面给的值相差太大。方法此结果与我们前面给的值相差太大。方法不是很好,但可以通过扩大随机测试值不是很好,但可以通过扩大随机测试值
8、来获得更精确的结果。来获得更精确的结果。注:实验中我应用了注:实验中我应用了“iomanip.h”中的中的setprecision(int);来设置输出精度。来设置输出精度。一道积分题我做过一道证明积分不等式的题:我想中间的积分值可以用蒙特卡洛法求得因为它是一个二重积分,其几何直观为一个立体的体积,很巧的是它可以完全包含于一个棱长为1的正方体中,我们在其中产生随机点,其中落于所求体积的点数与正方体中产生的点数之比即为所求的积分值。下面是它的C+代码:#include#include#include#includeconstlongN=2000000000;/*定义随机点数*/voidmain(
9、)longn=0;doublex,y,z;/*坐标*/srand(time(00);for(longi=1;i=N;i+)doublem;x=(double)rand()/RAND_MAX;y=(double)rand()/RAND_MAX;z=(double)rand()/RAND_MAX;/*在01之间产生一个随机x,y,z坐标*/m=0-(x*x+y*y);if(z=exp(m)n+;/*统计落入所求体积中的点数*/coutTheintegralis(double)n/Nendl;/*计算出积分值*/两端的界值下面是一次运行结果:恰好界于0.496466325949717和0.76666
10、6666666667之间Theintegralis0.5577358下面是我编写的Java程序,其实现方法与我编写的C+程序是相同的:publicclassCalculatePIpublicstaticfinalintN=2000000000;publicstaticvoidmain(Stringargs)doublex,y;intn=0;for(inti=0;iN;i+)x=Math.random();y=Math.random();if(x*x+y*y=1)n+;System.out.println(ThePIis+4*(double)n/N);publicclassCalculateIn
11、tegralpublicstaticfinalintN=2000000000;publicstaticvoidmain(Stringargs)doublex,y,z,m;intn=0;for(inti=0;iN;i+)x=Math.random();y=Math.random();z=Math.random();m=0-x*x-y*y;if(z=Math.exp(m)n+;System.out.println(TheIntegralis+(double)n/N);蒙特卡洛方法是一种比较粗糙的计算方法,它与其说是一种数学的方法,不如看成一种实验方法;有的时候人们不得不依赖于此种方法。一来人们的才
12、智不够,二来它的确在某些方面给我们知识;但不可否认对于可控参数比较少的情况,蒙特卡洛法不失为一个对研究对象获得认识的一个有效方法;从计算来说,用蒙特卡洛法计算值确实粗糙,我们一般用更好的方法来计算。比如说级数的方法,下面是我用级数的方法编的C+和Java程序:/CalculatePI_Ad.cpp#include#includevoidmain()doublesum=0.0,f=1;for(inti=1;i+=2)sum+=f/i;if(1.0/i=1e-14)break;f=-f;coutThePIissetprecision(15)4*sumendl;ThePIis3.14159265079415publicclassCalculatePI_Adpublicstaticvoidmain(Stringargs)doublesum=0.0,f=1;for(inti=1;i+=2)sum+=f/i;if(1.0/i=1e-15)break;f=-f;sum*=4;System.out.println(ThePIis+sum);System.out.println(ThePIinMathclassis+Math.PI);ThePIis3.1415926507941494ThePIinMathclassis3.141592653589793Game Over!