下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、概率特性仿真实验与程序-Matlab仿真-随机数生成-负指数分布-k阶爱尔兰分布-超指数分布使用Java中的SecureRandom.nextDouble()生成一个01之间的随机浮点数,然后使用反函数法生成一个符合指数分布的随机变量(反函数求得为)。指数分布的参数为getExpRandomValue函数中的参数lambda。生成一个指数分布的随机变量的代码如下,后面都将基于该函数生成一组负指数分布、K阶爱尔兰分布、2阶超指数分布随机变量,然后将生成的随机数通过matlab程序进行仿真,对随机数的分布特性进行验证。public static double getExpRandomValue(d
2、ouble lambda)return (-1.0/lambda)*Math.log(1-SecureRandom.nextDouble(); 生成一组参数为lambda()的负指数分布的随机变量通过下面的函数生成一组参数为lambda的随机变量,其中size表示随机变量的个数。通过该函数生成之后,可以将这些随机值保存在文件中,以备分析和验证,比如保存在exp.txt文件中,供下面介绍的matlab程序分析。public static double genExp(int size, double lambda)double array = new doublesize; while(-size
3、>=0) arraysize = getExpRandomValue(lambda); return array;通过genExp(1000000, 0.2)生成1000000个参数为0.2的随机变量,然后保存到exp.txt中,然后使用下面的matlab程序对这些随机数的性质进行验证,如果这些随机数符合=0.2的负指数分布,则其均值应为1/,即1/0.2=5,其方差应为1/2=1/(0.2*0.2)=25。然后对这些随机数的概率分布进行统计分析,以长度为1的区间为统计单位,统计各区间内随机数出现的频数,求出在各区间的概率,绘制图形,与参数为的真实负指数分布曲线进行对比。下图为matla
4、b代码%测试以=0.2为参数的负指数分布%randomValues = load ('d:/exp.txt');%从文件导入生成的随机数X = 1:1:80;%以长度为1的区间为统计单位,统计180内的随机数频数m = mean(randomValues);%计算平均值,如果生成的随机数正确,均值应=1/=1/0.2=5d = var(randomValues);%计算方差,方差应=1/2=1/(0.22)=25all_count = length(randomValues);%随机数个数,方面后面将频数转成概率f,xout = hist(randomValues, X);%按
5、区间统计频数for i=1:length(X) f(i) = f(i)/all_count;%频数转概率end;Y = 0.2*exp(-1*0.2*X);%画出=0.2的负指数分布概密函数曲线plot(X,f,X,Y,'r');%与随机生成的概密函数曲线对比grid on;%显示格线legend('统计曲线','实际曲线');%图形注解title_str = sprintf('参数:0.2 均值:%d 方差:%d', m, d);title(title_str);如下图所示,均值为4.996423,约等于5,方差为24.9676
6、1,约等于25,与实际情况相符。此外,通过matlab统计的概率密度函数曲线与真实曲线基本重合(其中在0-1之间没有重合的原因是,实际情况是在0-1之间有无数个点,而matlab统计时以1为一个区间进行统计,只生成了一个统计项,而这无数个点的概率全部加到1点处,因此两条线没有重合,而且1点处的值远大于实际值,如果统计单位划分越细,0-1之间的拟合度更高),表明生成的随机数符合负指数分布。生成一组参数为lambda()的k阶爱尔兰分布的随机变量通过下面的函数生成一组参数为lambda的k阶爱尔兰分布随机变量,其中size表示随机变量的个数,k表示阶数。由于k阶爱尔兰分布是k个相同lambda的负
7、指数分布的串联,因此可以将连续k个负指数分布的随机变量相加成为一个爱尔兰分布的随机变量,从而生成爱尔兰分布的随机变量,如下面程序所示。通过该函数生成之后,可以将这些随机值保存在文件中,以备分析和验证,比如保存在erlang_k.txt文件中,供下面介绍的matlab程序分析。public static double genErlang(int size, double lambda, int k) double array = new doublesize; while(-size>=0) for(int i = 0; i<k; i+) arraysize += getExpRan
8、domValue(lambda); return array;通过genErlang(1000000, 0.2, 2)、genErlang(1000000, 0.2, 4)、genErlang(1000000, 0.2, 8)分别生成1000000个参数为0.2的2、4、8阶爱尔兰随机变量,然后分别保存到erlang_2.txt、erlang_4.txt、erlang_8.txt中,然后使用下面的matlab程序对这些随机数的性质进行验证,验证的方法与上面相同,对于k=2,则其均值应为k/,即2/0.2=10,其方差应为k/2=2/(0.2*0.2)=50;同理,对于k=4,均值应等于20,方
9、差应等于100;对于k=8,均值应等于40,方差应等于200。下图为matlab代码。%测试以=0.2为参数,K分别为2、4、8的爱尔兰分布%randomValues_2 = load ('d:/erlang_2.txt');%从文件导入生成的=0.2 K=2的随机数randomValues_4 = load ('d:/erlang_4.txt');%从文件导入生成的=0.2 K=4的随机数randomValues_8 = load ('d:/erlang_8.txt');%从文件导入生成的=0.2 K=8的随机数X = 1:1:80;%以长度为
10、1的区间为统计单位,统计180内的随机数频数m_2 = mean(randomValues_2);%计算平均值,如果生成的随机数正确,均值应=K/=2/0.2=10d_2 = var(randomValues_2);%计算方差,方差应=K/2=2/(0.22)=50m_4 = mean(randomValues_4);%计算平均值,如果生成的随机数正确,均值应=K/=4/0.2=20d_4 = var(randomValues_4);%计算方差,方差应=K/2=4/(0.22)=100m_8 = mean(randomValues_8);%计算平均值,如果生成的随机数正确,均值应=K/=8/0
11、.2=40d_8 = var(randomValues_8);%计算方差,方差应=1/2=8/(0.22)=200all_count_2 = length(randomValues_2);%随机数个数,方面后面将频数转成概率f_2,xout_2 = hist(randomValues_2, X);%按区间统计频数for i=1:length(X) f_2(i) = f_2(i)/all_count_2;%频数转概率end;all_count_4 = length(randomValues_4);%随机数个数,方面后面将频数转成概率f_4,xout_4 = hist(randomValues_4
12、, X);%按区间统计频数for i=1:length(X) f_4(i) = f_4(i)/all_count_4;%频数转概率end;all_count_8 = length(randomValues_8);%随机数个数,方面后面将频数转成概率f_8,xout_8 = hist(randomValues_8, X);%按区间统计频数for i=1:length(X) f_8(i) = f_8(i)/all_count_8;%频数转概率end;plot(X,f_2,'r',X,f_4,'g',X,f_8,'b');str1 = sprintf(
13、'k:2 m:%d d:%d', m_2, d_2);str2 = sprintf('k:4 m:%d d:%d', m_4, d_4);str3 = sprintf('k:8 m:%d d:%d', m_8, d_8);legend(str1,str2,str3); %图形注解 如下图所示,k=2时,均值为9.992167,约等于10,方差为49.93048,约等于50;k=4时,均值为20.00298,约等于20,方差为100.4140,约等于100;k=8时,均值为40.03118,约等于40,方差为200.4146,约等于200,以上结果
14、都与实际情况符合。生成一组2阶超指数分布的随机变量通过下面的函数生成一组参数分别为lambda1和lambda2的2阶超指数分布随机变量,其中size表示随机变量的个数,lambda1和lambda2表示两个负指数分布的参数,这里指定进入分支1的概率为1,进入分支2的概率为2。由于2阶超指数分布是2个参数分别为lambda1和lambda2的负指数分布的并联,且以一定概率进入各分支,因此可以根据概率随机的从两个参数不同的负指数分布中抽取一个随机变量作为一个超指数分布的随机变量,如下面程序所示。通过该函数生成之后,可以将这些随机值保存在文件中,以备分析和验证,比如保存在hyper_exp.txt
15、文件中,供下面介绍的matlab程序分析。public static double genHyperExp(int size, double lambda1, double lambda2)double a1 = 0.3;/a1:进入分支1的概率 因此a2=1-a1=0.7double array = new doublesize; while(-size>=0) if(SecureRandom.nextDouble()>a1) arraysize = getExpRandomValue(lambda2); else arraysize = getExpRandomValue(la
16、mbda1); return array;通过genHyperExp(1000000, 0.2, 0.5)生成1000000个参数分别为0.2和0.5,1=0.3、2=0.7的超指数分布随机变量,然后保存到hyper_exp.txt中,使用下面的matlab程序对这些随机数的性质进行验证,验证的方法与上面相同,如果生成的随机数正确,均值应=1/1+2/2=0.3/0.2+0.7/0.5=2.9,方差应=2*(1/12+2/22)-(1/1+2/2)2=12.19。下图为matlab代码。%测试1=0.2、1=0.5、1=0.3、2=0.7的2阶超指数分布%randomValues = load ('d:/hyper_exp.txt');%从文件导入生成的随机数X = 1:1:80;%以长度为1的区间为统计单位,统计180内的随机数频数m = mean(randomValues);%计算平均值,如果生成的随机数正确,均值应=1/1+2/2=0.3/0.2+0.7/0.5=2.9d = var(randomValues);%计算方差,方差应=2*(1/12+2/22)-(1/1+2/2)2=12.19all_count = length(rando
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2016年广东茂名中考满分作文《遇见十年后的自己》
- 项目桥梁协议居间
- 服务合同的履行数量
- 简易房拆毁工程合同
- 货物购销协议书
- 品牌合作协议范本
- 保护公共财产声明
- 空调清洁服务招标
- 代理投标权责分配协议
- 采购物品合同格式
- 线路检测报告
- Unit6UnderstandingideasLongjiRiceTerraces公开课赛课课件-高中英语
- 工程变更管理的重要性和注意事项
- 收费站冬季安全注意事项
- 行政执法有关知识讲座
- 房建施工测量培训课件
- 《领导者的沟通技巧》课件
- 【公开课】Unit+1Reading+for+writing+课件-人教版(2019)选择性必修第二册
- 艾滋病的危害
- 露营营地简介演示
- 粘土小汽车教案
评论
0/150
提交评论