泊松过程仿真
1 泊松过程仿真 一、仿真内容及目的 1.1 仿真内容 首先查阅相关资料,学习如何在仿真环境下对随机过程进行仿真。然后在 C 语言、MATLAB 等环境下,结合泊松过程的相关理论知识,设计算法及程序对 泊松过程进行仿真实验。最后对得到的实验结果进行分析。 1.2 仿真目的 利用仿真实验,将泊松过程这一抽象的概念图形化、数字化、具体化,生成 样本进行描述分析。加深对泊松过程这一抽象概念的认识和理解,其次掌握如何 运用仿真工具对所学的理论知识进行仿真模拟,增强自己的动手能力和自学能力。 二、实验原理 计数过程 定义:设 N(t)表示到时刻 t 为止已发生的“事件 A”的总数,若 N(t)满足下 列条件: (1)N(t)0; (2)N(t)取正整数值; (3)若ts,则 N(s)N(t); (4)当ts时,N(s)-N(t)表示区间(s,t]中发生的“事件A”的次数。 则称随机过程0}t{N(t), 为计数过程。 泊松过程 定义:一个计数过程0}{N(t),,具有参数0,若它满足下列条件: (1)N(t)=0; (2)N(t)是独立增量过程; (3)在任一长度为 t 的区间内, 事件发生的次数服从参数0的泊松分布, 即对任意事件 S,0t ,有 ,1 , 0, ! )( en}N(s)-s)P{N(t t-n n t n 则称0}t{N(t), 为泊松过程。 2 根据以上定义,令随机变量) 1(T n n表示从第(n-1)次事件发生到第 n 次 事件发生的时间间隔, 则可以证明, n T服从互相独立但参数为的相同指数分布。 因为只要按照参数产生指数分布的随机时间间隔序列, 并计数系统随时间运行 的过程中, 按这个时间间隔序列对系统状态进行加 1 计数,则这个计数系统就对 应了参数为的泊松过程。 三、仿真环境及算法 3.1 仿真环境 C 语言、MATLAB 2.2 仿真算法 时间区间为[0,T],泊松过程的速率为 。 (1)令当前时刻 t=0,泊松事件计数值 N=0,使其满足泊松过程定义的第 一个条件; (2)在 MATLAB 中,利用 rand()函数生成(0,1)上均匀分布的随机数 U, 利用逆变换法得到指数分布随机数 E,即令)(ln 1 -EU ; (3)令 t=t+E,如果 tT,则停止; (4)令 N=N+1 并设tt N ; (5)回到第 2 步。 四、仿真结果及分析 根据上述算法,我主要在 C 语言和 MATLAB 环境下做了仿真。C 语言环境下 能模拟出泊松过程的数据但不够清晰、 直观, 所以最后想到在 MATLAB 环境仿真, 将得到的数据图形化,这样便于分析理解。主要仿真如下: 4.1 C 语言环境下 这里设置时间区间为(0,10) ,即 T=10,=1。 实验结果: 3 图 1:第一次运行结果 图 2:第二次运行结果 结果分析: 分别执行两次程序, 分别得到两个不同的实验结果, 分别如图 1, 图 2 所示。 由图1可以看出该事件总共发生了13次, 发生的时间从小到大分别为: 0.756124, 1.065722,1.419995,2.923336,4.866784,5.304658,5.310878,5.425449, 5.481566,7.207677,7.541941,9.279402,9.499325;同理可以从图 2 可以知 道该事件发生的次数和对应的时间。 4.2 MATLAB 环境下 这里设置样本函数 1 的时间区间为(0,15) ,=1;样本函数 2 的时间区间 为(0,15) ,=2。 实验结果: 4 图 3:第一次仿真波形 图 4:第一次仿真结果 051015 0 5 10 15 20 25 泊 松 过 程 时 间 t 计 数 过 程 N ( t ) 样 本 函 数 1 样 本 函 数 2 5 图 5:第二次仿真波形 图 6:第二次仿真结果 结果分析: 运行两次程序,得到两组数据,图 3 和图 4 位第一次运行程序得到的实验结 果, 图5和图6为第二次运行程序得到的实验结果。 图4为泊松过程产生的数据, x1 表示样本函数 1 对应的时间节点,y1 为样本函数 1 的时间节点所对应的事件 发生次数;根据图 4 的样本数据得到图 3 的波形图,由图中可以看出,整个过程 是递增的, 并且可以找到每个时间节点所对应的事件发生次数。 因为整个过程是 随机的, 所以我们可以看到图 5 和图 6 得到的实验结果和第一次得到的实验结果 不大一样,但总体趋势都是递增的。 051015 0 5 10 15 20 25 30 泊 松 过 程 时 间 t 计 数 过 程 N ( t ) 样 本 函 数 1 样 本 函 数 2 6 五、实验代码 C 语言代码 #include #include #include int main() { int N = 0,T = 10; double U,E; double t = 0; double lamda = 1.0; printf(“时间 t%d:%lf,发生的次数 N:%d\n“,N,t,N); srand((unsigned)time(NULL));//初始化随机数 while(1) { U = rand()/(RAND_MAX+1.0); E = -(1/lamda)*log(U); t = t + E; if(t T) break; else { N = N + 1; printf(“时间 t%d:%lf,发生的次数 N:%d\n“,N,t,N); } } return 0; } 7 MATLAB 代码 %样本函数 1 lamda1 = 1.0;T1 = 15;t1 = 0;N1=0; x1=[];y1=[];x1(1)=0;y1(1)=0; while t1 T1; U1 = rand(); E1 = -(1/lamda1)*log(U1); t1 = t1 + E1; if(t1T1) N1 = N1 + 1; x1(N1+1)=t1; y1(N1+1)=N1; end end y1 x1 %样本函数 2 lamda2 = 2.0;T2 = 15;t2 = 0;N2=0; x2=[];y2=[];x2(1)=0;y2(1)=0; while t2 T2; U2 = rand(); E2 = -(1/lamda2)*log(U2); t2 = t2 + E2; if(t2T2) N2 = N2 + 1; x2(N2+1)=t2; y2(N2+1)=N2; end end y2 x2 stairs(x1,y1, r- ); hold on stairs(x2,y2, k- ); title( 泊松过程 ) xlabel( 时间 t ) ylabel( 计数过程 N(t) ) legend( 样本函数 1 , 样本函数 2 ,2) title( 泊松过程 ) xlabel( 时间 t ) ylabel( 计数过程 N(t) )