1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
蒙特卡罗方法的主要应用范围 它的主要应用范围包括:粒子输运问题,统计物理,典型数学问题,真空技术,激光技术以及医学,生物,探矿等方面,特别适用于在计算机上对大型项目、新产品项目和其他含有大量不确定因素的复杂决策系统进行风险模拟分析。随着科学技术的发展,其应用范围将更加广泛。 例.蒲丰氏问题 设针投到地面上的位置可以用一组参数(x,θ)来描述,x为针中心的坐标,θ为针与平行线的夹角,如图所示。 任意投针,就是意味着x与θ都是任意取的,但x的范围限于[0,a],夹角θ的范围限于[0,π]。在此情况下,针与平行线相交的数学条件是 一些人进行了实验,其结果列于下表 : 20世纪四十年代,由于电子计算机的出现,利用电子计算机可以实现大量的随机抽样的试验,使得用随机试验方法解决实际问题才有了可能。 其中作为当时的代表性工作便是在第二次世界大战期间,为解决原子弹研制工作中,裂变物质的中子随机扩散问题,美国数学家冯.诺伊曼(Von Neumann)和乌拉姆(Ulam)等提出蒙特卡罗模拟方法。 由于当时工作是保密的,就给这种方法起了一个代号叫蒙特卡罗,即摩纳哥的一个赌城的名字。用赌城的名字作为随机模拟的名称,既反映了该方法的部分内涵,又易记忆,因而很快就得到人们的普遍接受。 蒙特卡罗方法的基本思想 由蒲丰试验可以看出,当所求问题的解是某个事件的概率,或者是某个随机变量的数学期望,或者是与概率、数学期望有关的量时,通过某种试验的方法,得出该事件发生的频率,或者该随机变量若干个具体观察值的算术平均值,通过它得到问题的解。这就是蒙特卡罗方法的基本思想。 蒙特卡罗方法的基本思路 随机数的产生是实现MC计算的先决条件。而大多数概率分布的随机数的产生都是基于均匀分布U(0,1)的随机数。 一、随机数的产生及算法 1.随机数的概念 2、(0, 1)上均匀随机数的产生方法 随机数表 物理方法 计算机方法 随机数表 随机数表是由0,1,2,…,9十个数字组成,每个数字以0.1的概率出现,数字之间相互独立。 方法:如果要得到n位有效数字的随机数,只需将表中每n个相邻的随机数字合并在一起,且在最高位的前边加上小数点即可。 例如:某随机数表第一行数字为7634258910…,要想得到三位有效数字的随机数依次为:0.763,0.425,0.891 物理方法 基本原理:利用某些物理现象,在计算机上增加些特殊设备,可以在计算机上直接产生随机数。 缺点:无法重复实现 费用昂贵 计算机方法 在计算机上产生随机数最实用、最常见的方法是数学方法,即用如下递推公式: 产生随机数序列,对于给定的初始值 ,确定 ,n=1,2… 存在的问题:1,不满足相互独立的要求 2,不可避免的出现重复问题 所以成为伪随机数 问题的解决:选取好的递推公式 在C语言中,使用Srand ( )和Rand( )函数。它本质上是利用同余法,y=ax+b(mod m)。其中a,b,m都是常数。因此rand的产生决定于x,x被称为Seed。Seed需要程序中设定,一般情况下取系统时间作为种子。它产生的随机数之间的相关性很小,取值范围是0—32767(int),即双字节(16位数),若用unsigned int 双字节是65535,四字节是4294967295,一般可以满足要求。 1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围0~65535; 2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间) 3) 根据需要多次调用rand(),从而不间断地得到新的随机数; 4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结 在[a,b]上均匀分布的分布函数为: C语言程序实现 bool UnionRandom(int n,double a,double b,double *x) { int i; double u; if(x==NULL) return false; srand(time(NULL)); for(i=0;in;i++) { u=1.0*rand()/RAND_MAX; x[i]=a+(b-a)*u; } return true; } C

文档评论(0)

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

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

1亿VIP精品文档

相关文档