ScientLee 发表于 2005-11-22 18:04

求基于c++的Monte Carlo源代码

本人现在想用Monte Carlo方法进行建模,但是没有其源代码!希望大家帮忙!!!不甚感激!

风花雪月 发表于 2005-11-22 20:56

回复:(ScientLee)求基于c++的Monte Carlo源代码

先专点别的相关内容大家看看,以下转自中山大学bbs

蒙特卡罗(Monte Carlo)方法:
蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法,属于计算数学的一个分
支,它是在本世纪四十年代中期为了适应当时原子能事业的发展而发展起来的。
传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法
由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结
果。这也是我们采用该方法的原因。
蒙特卡罗方法的基本原理及思想如下:
当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以
通过某种“试验”的方法,得到这种事件出现的频率,或者这个随机变数的平均值,并
用它们作为问题的解。这就是蒙特卡罗方法的基本思想。蒙特卡罗方法通过抓住事物运
动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模拟实验。它是
以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题
的近似解。可以把蒙特卡罗解题归结为三个主要步骤:构造或描述概率过程;实现从已
知概率分布抽样;建立各种估计量。
蒙特卡罗解题三个主要步骤:
构造或描述概率过程:
对于本身就具有随机性质的问题,如粒子输运问题,主要是正确描述和模拟这个概率过
程,对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为
的概率过程,它的某些参量正好是所要求问题的解。即要将不具有随机性质的问题转化
为随机性质的问题。
实现从已知概率分布抽样:
构造了概率模型以后,由于各种概率模型都可以看作是由各种各样的概率分布构成的,
因此产生已知概率分布的随机变量(或随机向量),就成为实现蒙特卡罗方法模拟实验
的基本手段,这也是蒙特卡罗方法被称为随机抽样的原因。最简单、最基本、最重要的
一个概率分布是(0,1)上的均匀分布(或称矩形分布)。随机数就是具有这种均匀分布的
随机变量。随机数序列就是具有这种分布的总体的一个简单子样,也就是一个具有这种
分布的相互独立的随机变数序列。产生随机数的问题,就是从这个分布的抽样问题。在
计算机上,可以用物理方法产生随机数,但价格昂贵,不能重复,使用不便。另一种方
法是用数学递推公式产生。这样产生的序列,与真正的随机数序列不同,所以称为伪随
机数,或伪随机数序列。不过,经过多种统计检验表明,它与真正的随机数,或随机数
序列具有相近的性质,因此可把它作为真正的随机数来使用。由已知分布随机抽样有各
种方法,与从(0,1)上均匀分布抽样不同,这些方法都是借助于随机序列来实现的,也就
是说,都是以产生随机数为前提的。由此可见,随机数是我们实现蒙特卡罗模拟的基本
工具。
建立各种估计量:
一般说来,构造了概率模型并能从中抽样后,即实现模拟实验后,我们就要确定一个随
机变量,作为所要求的问题的解,我们称它为无偏估计。建立各种估计量,相当于对模
拟实验的结果进行考察和登记,从中得到问题的解。
例如:检验产品的正品率问题,我们可以用1表示正品,0表示次品,于是对每个产品检
验可以定义如下的随机变数Ti,作为正品率的估计量:
于是,在N次实验后,正品个数为:
显然,正品率p为:
不难看出,Ti为无偏估计。当然,还可以引入其它类型的估计,如最大似然估计,渐进
有偏估计等。但是,在蒙特卡罗计算中,使用最多的是无偏估计。
用比较抽象的概率语言描述蒙特卡罗方法解题的手续如下:构造一个概率空间(W ,A,P)
,其中,W 是一个事件集合,A是集合W 的子集的s 体,P是在A上建立的某个概率测度;
在这个概率空间中,选取一个随机变量q (w ),w ? W ,使得这个随机变量的期望值
正好是所要求的解Q ,然后用q (w )的简单子样的算术平均值作为Q 的近似值。
蒙特卡罗方法与一般计算方法有很大区别,一般计算方法对于解决多维或因素复杂的问
题非常困难,而蒙特卡罗方法对于解决这方面的问题却比较简单。其特点如下:
· 直接追踪粒子,物理思路清晰,易于理解。
· 采用随机抽样的方法,较真切的模拟粒子输运的过程,反映了统计涨落的规律。
· 不受系统多维、多因素等复杂性的限制,是解决复杂系统粒子输运问题的好方法。
· MC程序结构清晰简单。
· 研究人员采用MC方法编写程序来解决粒子输运问题,比较容易得到自己想得到的任意
中间结果,应用灵活性强。
· MC方法主要弱点是收敛速度较慢和误差的概率性质,其概率误差正比于,如果单纯以
增大抽样粒子个数N来减小误差,就要增加很大的计算量。
近十年来,蒙特卡罗方法发展很快,从1983年到1988年期刊论文数量增长了五倍,有几
本好书是关于电子? 光子蒙特卡罗问题的[注1],蒙特卡罗方法的代码被认为是黑匣子,
它已成为计算数学中不可缺少的组成部分,这主要是因为以下原因:
· 传统的分析方法受到了问题复杂性的限制。
· MC方法直观,对实验者很有吸引力。
· 计算机变得更快更便宜。
· 量子理论的发展为我们提供了辐射与物质相互作用的截面数据。
[注1]:
· I.Lux and L.Koblinger,MONTE CARLO PARTICLE TRANSPORT METHODS:MEUTRON AND
PHOTO CALCULATIONS (CRC Press,1991).
· R.L.Morin(Editor),MONTE CARLO SIMULATION IN THE RADIOLOGICAL SCIENCES (CR
C Press,1988).[Contributors: H.-P. Chan, K.Doi, J.E.Goin, R.L.Morin, R.Nath,
D.E.Raeside,J.C.Widman and J.F.Williamson]
· T.M.Jenkins, W.R.Nelson, A.Rindi, A.E.Nahum and D.W.O.Rogers (Editors), M
ONTE CARLO TRANSPORT OF ELECTRONS AND PHOTOS (Plenum Press,1988). [Contribut
ors: P.Andro, M.J.Berger, A.F.Bielajew, A.Del Guerra, B.Grosswendt, J.Halble
ib, A.Ito, T.M.Jenkins, R.Monhan, A.E.Nahum, W.R.Nelson, D.W.O.Rogers, S.Sel
tzer and R.Wang]
蒙特卡罗方法的计算程序:
关于蒙特卡罗方法的计算程序已经有很多,如:EGS4、FLUKA、ETRAN、ITS、MCNP、GEA
NT等。这些程序大多经过了多年的发展,花费了几百人年的工作量。除 分藓俗友芯恐
心(CERN)发行的GEANT主要用于高能物理探测器响应和粒子径迹的模拟外,其它程序都
深入到低能领域,并被广泛应用。就电子和光子输运的模拟而言,这些程序可被分为两
个系列:
1.EGS4、FLUKA、GRANT
2.ETRAN、ITS、MCNP
这两个系列的区别在于:对于电子输运过程的模拟根据不同的理论采用了不同的算法。
EGS4和ETRAN分别为两个系列的基础,其它程序都采用了它们的核心算法。
ETRAN(for Electron Transport)由美国国家标准局辐射研究中心开发,主要模拟光子和
电子,能量范围可从1KeV到1GeV。
ITS(The integrated TIGER Series of Coupled Electron/Photon Monte Carlo Trans
port Codes )是由美国圣地亚哥(Sandia)国家实验室在ETRAN的基础上开发的一系列模
拟计算程序,包括TIGER 、CYLTRAN 、ACCEPT等,它们的主要差别在于几何模型的不同
。TIGER研究的是一维多层的问题,CYLTRAN研究的是粒子在圆柱形介质中的输运问题,
ACCEPT是解决粒子在三维空间输运的通用程序。
NCNP(Monte Carlo Neutron and Photo Transport Code)由美国橡树林国家实验室(Oak
Ridge National Laboratory)开发的一套模拟中子、光子和电子在物质中输运过程的通
用MC 计算程序,在它早期的版本中并不包含对电子输运过程的模拟,只模拟中子和光子
,较新的版本(如MCNP4A)则引进了ETRAN,加入了对电子的模拟。
FLUKA 是一个可以模拟包括中子、电子、光子和质子等30余种粒子的大型MC计算程序,
它把EGS4容纳进来以完成对光子和电子输运过程的模拟,并且对低能电子的输运算法进
行了改进。

[ 本帖最后由 风花雪月 于 2006-10-23 15:16 编辑 ]

风花雪月 发表于 2005-11-22 20:59

回复:(ScientLee)求基于c++的Monte Carlo源代码

上面提到的这些程序有一部分可以在google上搜索到,如果需要的话自己搜索一下

我这里还有一个免费的用于简化Monte-Carlo模拟的C++工具包。它是一个遵守LGPL协议的库。附件中提供了文档和例子。

http://forum.vibunion.com/forum/thread-29261-1-1.html

[ 本帖最后由 风花雪月 于 2006-10-23 15:19 编辑 ]

xhtoday 发表于 2005-11-25 21:28

呵呵,赞<BR>这都能找到<BR>

sunmin 发表于 2006-5-22 17:00

回复:(风花雪月)回复:(ScientLee)求基于c++的Mo...

如果我想用MTALAB来实现,不知道该怎么做<BR><BR><BR><BR>

风花雪月 发表于 2006-5-28 10:12

回复:(sunmin)回复:(风花雪月)回复:(ScientLe...

这个建议去matlab版问问

[ 本帖最后由 风花雪月 于 2006-10-23 15:19 编辑 ]

风花雪月 发表于 2006-5-28 10:14

回复:(sunmin)回复:(风花雪月)回复:(ScientLe...

另外最好说明一下用来解决什么问题,至今没有见过该算法通用的程序

[ 本帖最后由 风花雪月 于 2006-10-23 15:19 编辑 ]

hh1021 发表于 2006-10-22 23:28

楼主,厉害

ScientLee 发表于 2006-11-19 19:41

收到,谢谢大家的帮忙!
我主要是想在VC中实现MC,然后用于材料凝固方面的模拟

ScientLee 发表于 2006-11-19 19:46

我以前是搞神经网络和遗传算法的,由于其局限性想用Monte carlo 实施一下,故需要一个完整的基于vc的MC源代码作为基础来研究!见笑了

风花雪月 发表于 2006-11-20 08:41

原帖由 ScientLee 于 2006-11-19 19:46 发表
我以前是搞神经网络和遗传算法的,由于其局限性想用Monte carlo 实施一下,故需要一个完整的基于vc的MC源代码作为基础来研究!见笑了


http://forum.vibunion.com/forum/thread-29261-1-1.html应该能够满足你的要求
页: [1]
查看完整版本: 求基于c++的Monte Carlo源代码