蒙特卡罗方法



《蒙特卡罗方法》由会员分享,可在线阅读,更多相关《蒙特卡罗方法(30页珍藏版)》请在文档大全上搜索。
1、1. 蒙特卡罗方法的基本思想蒙特卡罗方法的基本思想2. 蒙特卡罗方法的收敛性,误差蒙特卡罗方法的收敛性,误差3. 蒙特卡罗方法的特点蒙特卡罗方法的特点4. 蒙特卡罗方法的主要应用范围蒙特卡罗方法的主要应用范围 蒙特卡罗方法又称随机抽样技巧或统计试验方法。半个多世纪以来,由于科学技术的发展和电子计算机的发明 ,这种方法作为一种独立的方法被提出来,并首先在核武器的试验与研制中得到了应用。 蒙特卡罗方法是一种计算方法,但与一般数值计算方法有很大区别。它是以概以概率统计理论为基础的一种方法率统计理论为基础的一种方法。由于蒙特卡罗方法能够比较逼真地描述事物的特点及物理实验过程,解决一些数值方法难以解决的
2、问题,因而该方法的应用领域日趋广泛。 两个例子 例1. 蒲丰氏问题 例2. 射击问题(打靶游戏) 例3. 积分基本思想计算机模拟试验过程将长为2l的一根针任意投到地面上,用针与一组相间距离为2a(la)的平行线相交的频率代替概率P,再利用准确的关系式: 求出值 其中为投计次数,n为针与平行线相交次数。alP2)(22nNalaPl 一些人进行了实验,其结果列于下表 :实验者年份投计次数的实验值沃尔弗(Wolf)185050003.1596斯密思(Smith)185532043.1553福克斯(Fox)189411203.1419拉查里尼(Lazzarini)190134083.1415929
3、设r表示射击运动员的弹着点到靶心的距离,(r)表示击中r处相应的得分数(环数),f(r)为该运动员的弹着点的分布密度函数,它反映运动员的射击水平。该运动员的射击成绩为 用概率语言来说,是随机变量(r)的数学期望,即 )(rgEg 0)()(drrfrgg 现假设该运动员进行了次射击,每次射击的弹着点依次为r1,r2,rN,则次得分g(r1),g(r2),g(rN)的算术平均值 代表了该运动员的成绩。换言之,为积分的估计值,或近似值。 在该例中,用用次试验所得成绩的算术平次试验所得成绩的算术平均值作为数学期望均值作为数学期望 的估计值的估计值(积分近似值)。 NiiNrgNg1)(1 当所求问题
4、的解是某个事件的概率,或者是某个随机变量的数学期望,或者是与概率、数学期望有关的量时,通过某种试验的方法,得出该事件发生的频率,或者该随机变量若干个具体观察值的算术平均值,通过它得到问题的解。这就是蒙特卡罗方法的基本思想。 蒙特卡罗方法是用随机试验的方法计算积分,即将所要计算的积分看作服从某种分布密度函数f(r)的随机变量(r)的数学期望 通过某种试验,得到个观察值r1,r2,rN(用概率语言来说,从分布密度函数f(r)中抽取个子样r1,r2,rN,),将相应的个随机变量的值g(r1),g(r2),g(rN)的算术平均值 作为积分的估计值(近似值)。 NiiNrgNg1)(10)()(drrf
5、rgg 计算机模拟试验过程,就是将试验过程(如投针,射击)化为数学问题,在计算机上实现。以上述两个问题为例,分别加以说明。 例1. 蒲丰氏问题 例2. 射击问题(打靶游戏) 例3. 求积分问题 设针投到地面上的位置可以用一组参数(x,)来描述,x为针中心的坐标,为针与平行线的夹角,如图所示。 任意投针,就是意味着x与都是任意取的,但x的范围限于0,a,夹角的范围限于0,。在此情况下,针与平行线相交的数学条件是:针在平行线间的位置 sin lx 如何产生任意的(x,)?X在0,a上任意取值,表示x在0,a上是均匀分布的,其分布密度函数为:类似地,的分布密度函数为:因此,产生任意的(x,)的过程就
6、变成了由f1(x)抽样x及由f2() 抽样的过程了。由此得到: 其他, 00,/1)(1axaxf其他, 00,/1)(2f21 ax 其中1,2均为0,1上均匀分布的随机变量。 每次投针试验,实际上变成在计算机上从两个均匀分布的随机变量中抽样得到(x,),然后定义描述针与平行线相交状况的随机变量s(x,),为 如果投针次,则 是针与平行线相交概率的估计值。事实上, 于是有: 其他当, 0sin, 1),(lxxsNiiiNxsNs1),(1aladxddxdfxfxsPl2)()(),(sin0021NsalaPl22 int main() /文件地址F:PuFengShiPuFengShi
7、0 const int N = 5000000; /总的投样次数 const double PI = 3.1415926535898; /定义的初始值,用于抽样角 const double a = 2.0, l = 1.8; /定义平行线半间距a及针半长l double pi = 0.0f; /初始化所要计算的值 double x = 0.0f, theta = 0.0f; int Count = 0; /针与直线相交的次数/用该语句初始化Rand()函数,使得每次产生的随机数均不同/参见http:/ srand( (unsigned int)time(NULL)*1000 ); /srand