大数定律积分应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

大数定律的应用

------------蒙特卡罗积分法 一、概述

(一)、大数定律:

设X 1,X 2,.…是相互独立的,服从同一分布的随机变量序列,且具有数学期望

E (X k

)=u(k=1,2,…).作前n 个变量的算术平均值

∑=n

k k X 1

n

1

,则对于任意ε>0,有

1}|1

{|

lin

1

=<-∞

→∑=εμn

k k X n

P n ①

等式①表明,当∞→n 时这个事件当概率趋于1.即对于任意正数 ε,当n 充分大时,不等式 |

∑=n

k k X 1

n

1

-µ|<ε成立的概率很大,通俗地说,辛钦大数定理是说,对于独立同分布且

具有均值μ,的随机变量X 1 ,…,X n ,当n 很大时他们的算术平均 ∑=n

k k X 1

n

1

很可能接近

于μ.

(二)、蒙特卡罗法

蒙特学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法,与它对应的是确定性算法。

定积分的计算是Monte Carlo 方法引入计算数学的开端,在实际中,许多需要计算多重积分的复杂问题,用Monte Carlo 方法一般都能够很有效地予以解决,尽管Monte Carlo 方法给出的计算结果的精确度不是非常高,但它能很快地提供出一个低精度的模拟结果也是很有价值的。在多重积分计算中,由于Monte Carlo 方法的误差与积分重数无关,所以它比常用的均匀网格求积公式要优越。 二、基本原理

根据数学期望的定义,当x 在(a,b)上满足均匀分布时,

)]([)()(g a

x g E a b dx x b

-=⎰

我们在(a,b )之间取n 个随机数,n 的值非常大,当n 的值大到一定程度时我们可以用

∑=n

k k

x g 1

)(n

1

近似g(x)在(a,b)上的数学期望E[g(x)],由此我们再利用公式②

,即可得到g(x)在区间(a,b)上的积分的近似值。 三、实例分析

(一)sin 函数的积分

首先计算一个比较简单的可以直接进行手算积分的函数的积分

2

s i n π

x d x

1)、基本思路

在(0,π/2)之间取10000个随机数,然后计算出它们的平均值

∑=n

k k

x

g 1

)(n

1,由

于10000个数据已经足够大,在要求不是非常高的情况下我们可以近似得认为它们的平均值

∑=n

k k

x g 1

)(n

1

就等于g(x)在(0,π/2)之间的数学期望E[g(x)]。最后利用公式②

可得

2

s i n π

x d x =(π/2-0)E[g(x)]

2)、c 程序实现 #include "stdio.h"

#include "time.h" #include "math.h" #include "dos.h" #define PI 3.1415926

void main()

{ double t,x,y,sum=0; long i;

char end;

printf("wait...");

srand((int)time(0)); /*设置随机数种子,保证每次运行程序的结果不一样 */ for(i=0;i<=100000;i++) {

x=rand()%10000; /* 取一个在0到10000范围内的整数 */ x=x/10000*PI/2; /*将随机数转换为(0,π/2)上的随机数 */ t=sin(x); /*计算sin 函数,即求每个随机数对应的函数值 */ sum=sum+t; /* 对随机数的函数值进行求和 */ }

printf("\n%f ",PI/2*sum/--i); /*计算出g(x)的数学期望乘以π/2求出积分的*/ /* 似值并输出 */

scanf("%c",&end); /*使程序停在输出完结果的画面, */ }

3) 理论计算

由于sin 函数的积分是比较简单的,我们可以直接对其进行积分,求得精确结果

2

s i n π

x d x =(-cos 0

2

/|

x π)=1

4)蒙特卡罗法估算结果分析

多次运行程序得到运行结果如下 0.983056 0.981828 0.982811 0.982450 0.981573 0.981261 0.981746 0.981057

0.982819 0.082183

从上面10次运行程序输出的结果可以看到用蒙特卡罗积分法得到的估计值基本稳定在 0.982附近,首先这个值已经比较精确,已经基本达到估算的要求。但令一方面,这个值并不是在准确值1附近浮动,而是普遍偏小一点点。

误差的来源应该是多方面的但主要在于以下几点

1、在c 程序中产生的随机数并不是真正意义上的完美的随机数,我们利用 x=rand()%10000; 产生令从0到9999之间的整数,然后令

x=x/10000*PI/2;

从而得到(0,π/2)区间上的随机数,很显然用这种方法得到的随机数是一些特定的离散的值,着必然会带来一定的误差。

2、在c 程序中当数值的长度超过变量的位数是采用的是舍弃最后多余位的方法,这样必然导致每一个函数值都要比真实值略小,虽然这个误差非常小,但是在100000个抽样值中都存在这个问题,所以积少成多,最终的运算结果也会比真实值略小。

(二)、多项式函数的积分

接下来计算一个积分范围不是从0开始的多项式积分

⎰++2

1

3

4

)42x

dx

x x (

1)、基本思路

在(1,2)之间取10000个随机数,然后计算出它们的平均值

∑=n

k k

x

g 1

)(n

1,

由于10000个数据已经足够大,在要求不是非常高的情况下我们可以近似得认为它们的平均值

∑=n

k k

x g 1

)(n

1

就等于g(x)在(1,2)之间的数学期望E[g(x)]。最后利用公式②

可得 ⎰++2

1

3

4)42x dx x x ( =(1-2)E[g(x)]

2)、c 程序实现 #include "stdio.h" #include "time.h"

相关文档
最新文档