随机模拟与实验
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
随机模拟与实验
• 随机模拟的基本方法又称为蒙特卡罗(Monte Carlo)方法。 是Velleman与Von Neumann等人在20世纪40年代为研制核武 器提出来的,已大量地运用于计算机仿真试验。 • 随机模拟的典型步骤: 1、根据问题构建模拟系统 2、仿真系统中各种分布的随机变量 3、运行模拟系统,进行统计测量 4、分析数据,输出结果 • 主要工具 基本工具:C、C++等编程模拟、matlab 网络模拟:OPNET Modeler、NS2:大型网络仿真 CASSAP:数字信号处理;SPW:电子系统
F ( x)
f U (u )du
F ( x)
1du F ( x)
其中,f U (u )是U (0,1)的密度函数。
7
一般随机数的产生方法(续)
• 例如:利用变换法产生指数分布随机数的方法。 参数为的指数分布的分布函数 为
F ( x) 1 e x,其反函数为 1 X F 1 (U ) ln(1 U )
18
MyRand.cpp的函数
• double CMyRand::ExpRandom(double lambda, double min, double max)
– 函数功能:产生参数为lambda的指数分布的随 机数 – 参数: lambda为指数分布的参数, min和max 为均匀分布随机变量的取值范围。所有参数在 randomDlg.cpp的OnExp ()和OnExpStat ()函 数中设置。 – 实现思路:利用逆变换法
2
3
1 4 5
14
实验平台介绍
• 实验平台包含的源文件
– – – – StdAfx.cpp:VC工程自带文件,不能修改 random.cpp和random.h:工程主文件,不能修改 Scope.cpp和Scope.h :画图程序,不能修改 randomDlg.cpp和randomDlg.h:主界面程序,包括对 各个按钮的动作的响应,还包括对各种随机变量的输 入参数的设定 – MyRand.cpp和MyRand.h:各种分布的随机变量的产 生程序,实验过程中主要完成MyRand.cpp中的函数即 可
1.E(X(n)) 2.RX(m).打印m=-N,…-1,0,1,…N;其中N=64时的自相关序列值,并绘出 RX(m)的曲线. 3.相关系数序列RX(m)=KX(m)/ KX(0),并打印m=-N,…-1,0,1,…N;其中 N=64时的自相关系数序列值,并绘出RX(m)的曲线.
11
平稳随机过程的数字特征
pi
因此,采用递推法构成泊松分布: 1)产生[0,1]均匀分布随机数u; i 0, p e , F p ; 2) 3)若u<F,令X=i,停止; 4) p p /( 1), F F p, i i 1; 5)转向3)。
9
正态分布随机变量的产生方法
标准正态随机变量的分布函数 故采用如下方法: 存在显式,因此也不能用逆变法产生。
12
实验平台介绍
波形显示 区域
将显示的 结果保存 为*.bmp文 件
产生各种 分布的随 机数 统计并显 示各种分 布的概率 密度或分 布律
显示均值
实验自相 关序列并 显示Rx
13
实验执行步骤
1. 选择执行的实验 内容 2. 在出现正确结果 后,选择“保存” 3. 选择结果保存的 目录 4. 输入保存结果的 文件名,必须为 *.bmp文件 5. 选择“保存”
20
MyRand.cpp的函数
• double CMyRand::Ex(void)
– 函数功能:计算任意分布的随机过程的均值。 本函数在randomDlg.cpp的OnSelf()函数中调用。
21
MyRand.cpp的函数
• double* CMyRand::Rx(double lambda, int points)
• 因此,X的模拟方法为 1)产生均匀分布随机数{ui}; 2)计算指数分布随机数:xi=-ln ui /λ
8
泊松分布随机变量的产生方法
i! 从泊松分布的分布律可知,采用前述方法很不适用。由于 pi P{ X i}
i e
pi 1
i 1e
(i 1)!
i 1
•
•
5
伪随机数的算法(续)
• 线性同余法
– 1)设置y0,即设置种子 – 2)yn=kyn-1(mod N),un=yn/N
• 三组常见的参数
– N=1010,k=7,周期≈5×107 – (IBM随机数发生器)N=231,k=216+3,周期 ≈5×108 – (ran0) N=231-1,k=75,周期≈2×109
6
一般随机数的产生方法
• 大部分计算机语言都提供了产生0-1间隔均匀分布随机数的标 准函数或方法: C语言中的rand函数,VB中的randum函数, java语言中的 Randnum类。 • 由均匀分布的随机数可构造出任一分布F(x)的随机数,最基本 的方法是逆变换法:
给定分布F ( x(假定它是严格单调的 ) ),由它的反函数 1 () F 对均匀随机变量 进行变换,可得: U X F 1 (U ) 则X的分布函数正好是 ( x)。因为 F FX ( x) P[ X x] P[ F 1 (U ) x] P[u F ( x)]
1
布丰(Buffon)投针试验
• 例子:布丰(Buffon)投针试验 将一根长为l的细针随机地投掷于标 有无数平行线的平面上,假定平行线间距为2l,则针与平行线相交 的概率为1/π。
解:设落在平面上的细 针的中心点为 ,角度为,o与上边平行 o 线的距离为D,则与D分别服从均匀分布 (0, )与U (0,2l ),且 U 彼此独立。定义事件 为{针与平行线相交,由下图可知, A } B (l / 2) sin ,则A {o进入阴影区 }
l
O
Θ
B B D
2l
B
2
随机数及其产生
• 定义:如果一个实数列{ui}与均匀分布的独立随机变量序列{Ui}的样本 序列具有相同的统计特性,则称之为随机的,该数列中的各个数称为 均匀分布随机数,简称随机数(Random Number)。 • 随机数的产生有三种方法: 1)将已有的随机数存表,需要时直接使用: 美国兰德公司在1950年曾将100万个在(0,1)区间内的实数存 入计算机外存储器,以便在仿真过程中进行随机调用。 2)将计算机连接到物理设备(如噪声源)上获得随机数流。(随机 性和均匀性最好,但产生过程太复杂,未能得到推广。) 3)通过数学算法产生随机数(伪随机数)。这种方法容易与计算机 结合,因而得到广泛的应用。
15
MyRand.cpp的函数
• unsigned int CMyRand::MyRand(unsigned int seed)
– 函数功能:采用线性同余法,根据输入的种子数产生 一个伪随机数,如果种子不变,则可以重复调用该函 数产生一个伪随机序列 – 参数: seed作为调用函数的输入种子,同一个伪随机 数序列可采用同一个seed – 实现思路:利用CMyRand类中定义的全局变量:S, K, N, Y。其中K和N为算法参数,S用于保存种子数,Y为 产生的随机数 – 注意事项:Y的初值的计算
19
MyRand.cpp的函数
• unsigned int CMyRand::PoisonRandom (double lambda, double min, double max)
– 函数功能:产生参数为lambda的产生泊松分布 的随机数 – 参数: lambda为泊松分布的参数, min和max 为均匀分布随机变量的取值范围。所有参数在 randomDlg.cpp的OnPoison ()和OnPoisonStat ()函数中设置。 – 实现思路:利用递归法
16
MyRand.cpp的函数
• double CMyRand::AverageRandom (double min,double max)
– 函数功能:产生一个在min~max范围内精度为 4位小数的平均分布的随机数 – 参数:min和max代表该均匀随机变量的取值范 围,精确到小数点后4位。该参数在 randomDlg.cpp中OnAverage ()和 OnAverageStat()函数中已经设置
4
伪随机数的算法
• 伪随机数是按照一定的计算公式产生的一列数,主要借助于如下的 递推公式: un=f(un-1,un-2,…,un-k) 该公式(或算法)也称为随机数发生器(RNG)。 常用的伪随机数的算法有: 1)平方取中法(Von Neumann 40年代发明) 2)乘法取中法 3)线性同余法:简单、实用 伪随机数发生器的特点: 1)产生的随机数序列具有循环周期性。可以证明,任何产生伪随 机数的算法总会进入循环,这样为了保证随机数序列不产生重复的 数据,就要求循环的周期足够长。 2)算法过程具有再现性:在初始化时,如果赋予相同的种子值, 将产生完全相同的随机数序列。
(m) 2 k m P{ X (n) X (n m) I } e k 0 (2k )!
2
(m) 2 k 1 m P{ X (n) X (n m) I } e (2k 1)! k 0
2
R(m) E[ X (n) X (n m)] I 2 e 2m
1 ( x) 2
Hale Waihona Puke Baidu
x
et / 2 dt 的反函数不
2
设Ui~U(0,1),i=1,2,…,n,且相互独立,由中心极限定理可
知,当n较大时
Z
n
i 1
U i nE (U i )
n D(U i )
~ N (0, 1)
10
平稳随机过程的数字特征
• 实验内容和步骤
– 设随机电报信号X(n)(-∞<n<+∞)是只取+I和-I变化的电流信号,对 于固定的n,,P{X(n)=+I}=P{X(n)=-I}=0.5,而正负号的变化是随机 的,在[n,n+m]时间内正负号变化的次数记为M(n,n+m).设M(n,n+m) 服从参数为λ,m的泊松分布,用VC编程求解:
• 实验原理
– 平稳随机过程数字特征求解的相关原理
RX(m)=I2e-2λ|m|; KX(m)= RX(m)-m2X (1)E(X(n))= I*P{X(n)=+I}+(-I)*P{X(n)=-I}=0 (2) R(m) E[ X (n) X (n m)] I 2 P{X (n) X (n m) I 2 } I 2 P{X (n) X (n m) 12 } 当 m 0 时,
– 函数功能:计算泊松过程的自相关序列 – 参数: lambda为泊松过程的参数, points为输 入随机数序列的个数。所有参数在 randomDlg.cpp的OnSelfStat () 函数中设置。 – 返回:函数返回一个动态分配的数组头指针, 产生的Rx序列保存于该数组中 – 注意:不要在本函数中释放该数组的内存
3
伪随机数
• 伪随机数的产生:用户只需给定一个初始的 随机数(种 子值),调用该算法,即可按某个固定的公式计算出下一 个“随机”数。随后,以新产生出来的“随机”数作为种 子,再计算出新的“随机”数。重复调用该算法即可产生 出一系列的“随机”数,以满足系统仿真的需要。 • 伪随机数本质上不是随机的。但只要计算公式选择得当, 通过比较严格地统计检验,仍然可以产生出一系列近似于 U(0,1)分布并且相对独立的随机数流,这种随机数流对于 大多数仿真模型,是能满足需要的。因此,仍然是目前广 泛应用的工程方法。
17
MyRand.cpp的函数
• double CMyRand::NormalRandom(double miu, double sigma, double min, double max)
– 函数功能:产生均值为miu,方差为sigma的正态分布 的随机数 – 参数: miu为均值, sigma为方差, min和max 为均匀 分布随机变量的取值范围。 所有参数在 randomDlg.cpp的OnNormal()和OnNormalStat()函数 中设置。 – 实现思路:利用中心极限定理,通过多个独立的均匀 随机变量之和构成正态随机变量
• 随机模拟的基本方法又称为蒙特卡罗(Monte Carlo)方法。 是Velleman与Von Neumann等人在20世纪40年代为研制核武 器提出来的,已大量地运用于计算机仿真试验。 • 随机模拟的典型步骤: 1、根据问题构建模拟系统 2、仿真系统中各种分布的随机变量 3、运行模拟系统,进行统计测量 4、分析数据,输出结果 • 主要工具 基本工具:C、C++等编程模拟、matlab 网络模拟:OPNET Modeler、NS2:大型网络仿真 CASSAP:数字信号处理;SPW:电子系统
F ( x)
f U (u )du
F ( x)
1du F ( x)
其中,f U (u )是U (0,1)的密度函数。
7
一般随机数的产生方法(续)
• 例如:利用变换法产生指数分布随机数的方法。 参数为的指数分布的分布函数 为
F ( x) 1 e x,其反函数为 1 X F 1 (U ) ln(1 U )
18
MyRand.cpp的函数
• double CMyRand::ExpRandom(double lambda, double min, double max)
– 函数功能:产生参数为lambda的指数分布的随 机数 – 参数: lambda为指数分布的参数, min和max 为均匀分布随机变量的取值范围。所有参数在 randomDlg.cpp的OnExp ()和OnExpStat ()函 数中设置。 – 实现思路:利用逆变换法
2
3
1 4 5
14
实验平台介绍
• 实验平台包含的源文件
– – – – StdAfx.cpp:VC工程自带文件,不能修改 random.cpp和random.h:工程主文件,不能修改 Scope.cpp和Scope.h :画图程序,不能修改 randomDlg.cpp和randomDlg.h:主界面程序,包括对 各个按钮的动作的响应,还包括对各种随机变量的输 入参数的设定 – MyRand.cpp和MyRand.h:各种分布的随机变量的产 生程序,实验过程中主要完成MyRand.cpp中的函数即 可
1.E(X(n)) 2.RX(m).打印m=-N,…-1,0,1,…N;其中N=64时的自相关序列值,并绘出 RX(m)的曲线. 3.相关系数序列RX(m)=KX(m)/ KX(0),并打印m=-N,…-1,0,1,…N;其中 N=64时的自相关系数序列值,并绘出RX(m)的曲线.
11
平稳随机过程的数字特征
pi
因此,采用递推法构成泊松分布: 1)产生[0,1]均匀分布随机数u; i 0, p e , F p ; 2) 3)若u<F,令X=i,停止; 4) p p /( 1), F F p, i i 1; 5)转向3)。
9
正态分布随机变量的产生方法
标准正态随机变量的分布函数 故采用如下方法: 存在显式,因此也不能用逆变法产生。
12
实验平台介绍
波形显示 区域
将显示的 结果保存 为*.bmp文 件
产生各种 分布的随 机数 统计并显 示各种分 布的概率 密度或分 布律
显示均值
实验自相 关序列并 显示Rx
13
实验执行步骤
1. 选择执行的实验 内容 2. 在出现正确结果 后,选择“保存” 3. 选择结果保存的 目录 4. 输入保存结果的 文件名,必须为 *.bmp文件 5. 选择“保存”
20
MyRand.cpp的函数
• double CMyRand::Ex(void)
– 函数功能:计算任意分布的随机过程的均值。 本函数在randomDlg.cpp的OnSelf()函数中调用。
21
MyRand.cpp的函数
• double* CMyRand::Rx(double lambda, int points)
• 因此,X的模拟方法为 1)产生均匀分布随机数{ui}; 2)计算指数分布随机数:xi=-ln ui /λ
8
泊松分布随机变量的产生方法
i! 从泊松分布的分布律可知,采用前述方法很不适用。由于 pi P{ X i}
i e
pi 1
i 1e
(i 1)!
i 1
•
•
5
伪随机数的算法(续)
• 线性同余法
– 1)设置y0,即设置种子 – 2)yn=kyn-1(mod N),un=yn/N
• 三组常见的参数
– N=1010,k=7,周期≈5×107 – (IBM随机数发生器)N=231,k=216+3,周期 ≈5×108 – (ran0) N=231-1,k=75,周期≈2×109
6
一般随机数的产生方法
• 大部分计算机语言都提供了产生0-1间隔均匀分布随机数的标 准函数或方法: C语言中的rand函数,VB中的randum函数, java语言中的 Randnum类。 • 由均匀分布的随机数可构造出任一分布F(x)的随机数,最基本 的方法是逆变换法:
给定分布F ( x(假定它是严格单调的 ) ),由它的反函数 1 () F 对均匀随机变量 进行变换,可得: U X F 1 (U ) 则X的分布函数正好是 ( x)。因为 F FX ( x) P[ X x] P[ F 1 (U ) x] P[u F ( x)]
1
布丰(Buffon)投针试验
• 例子:布丰(Buffon)投针试验 将一根长为l的细针随机地投掷于标 有无数平行线的平面上,假定平行线间距为2l,则针与平行线相交 的概率为1/π。
解:设落在平面上的细 针的中心点为 ,角度为,o与上边平行 o 线的距离为D,则与D分别服从均匀分布 (0, )与U (0,2l ),且 U 彼此独立。定义事件 为{针与平行线相交,由下图可知, A } B (l / 2) sin ,则A {o进入阴影区 }
l
O
Θ
B B D
2l
B
2
随机数及其产生
• 定义:如果一个实数列{ui}与均匀分布的独立随机变量序列{Ui}的样本 序列具有相同的统计特性,则称之为随机的,该数列中的各个数称为 均匀分布随机数,简称随机数(Random Number)。 • 随机数的产生有三种方法: 1)将已有的随机数存表,需要时直接使用: 美国兰德公司在1950年曾将100万个在(0,1)区间内的实数存 入计算机外存储器,以便在仿真过程中进行随机调用。 2)将计算机连接到物理设备(如噪声源)上获得随机数流。(随机 性和均匀性最好,但产生过程太复杂,未能得到推广。) 3)通过数学算法产生随机数(伪随机数)。这种方法容易与计算机 结合,因而得到广泛的应用。
15
MyRand.cpp的函数
• unsigned int CMyRand::MyRand(unsigned int seed)
– 函数功能:采用线性同余法,根据输入的种子数产生 一个伪随机数,如果种子不变,则可以重复调用该函 数产生一个伪随机序列 – 参数: seed作为调用函数的输入种子,同一个伪随机 数序列可采用同一个seed – 实现思路:利用CMyRand类中定义的全局变量:S, K, N, Y。其中K和N为算法参数,S用于保存种子数,Y为 产生的随机数 – 注意事项:Y的初值的计算
19
MyRand.cpp的函数
• unsigned int CMyRand::PoisonRandom (double lambda, double min, double max)
– 函数功能:产生参数为lambda的产生泊松分布 的随机数 – 参数: lambda为泊松分布的参数, min和max 为均匀分布随机变量的取值范围。所有参数在 randomDlg.cpp的OnPoison ()和OnPoisonStat ()函数中设置。 – 实现思路:利用递归法
16
MyRand.cpp的函数
• double CMyRand::AverageRandom (double min,double max)
– 函数功能:产生一个在min~max范围内精度为 4位小数的平均分布的随机数 – 参数:min和max代表该均匀随机变量的取值范 围,精确到小数点后4位。该参数在 randomDlg.cpp中OnAverage ()和 OnAverageStat()函数中已经设置
4
伪随机数的算法
• 伪随机数是按照一定的计算公式产生的一列数,主要借助于如下的 递推公式: un=f(un-1,un-2,…,un-k) 该公式(或算法)也称为随机数发生器(RNG)。 常用的伪随机数的算法有: 1)平方取中法(Von Neumann 40年代发明) 2)乘法取中法 3)线性同余法:简单、实用 伪随机数发生器的特点: 1)产生的随机数序列具有循环周期性。可以证明,任何产生伪随 机数的算法总会进入循环,这样为了保证随机数序列不产生重复的 数据,就要求循环的周期足够长。 2)算法过程具有再现性:在初始化时,如果赋予相同的种子值, 将产生完全相同的随机数序列。
(m) 2 k m P{ X (n) X (n m) I } e k 0 (2k )!
2
(m) 2 k 1 m P{ X (n) X (n m) I } e (2k 1)! k 0
2
R(m) E[ X (n) X (n m)] I 2 e 2m
1 ( x) 2
Hale Waihona Puke Baidu
x
et / 2 dt 的反函数不
2
设Ui~U(0,1),i=1,2,…,n,且相互独立,由中心极限定理可
知,当n较大时
Z
n
i 1
U i nE (U i )
n D(U i )
~ N (0, 1)
10
平稳随机过程的数字特征
• 实验内容和步骤
– 设随机电报信号X(n)(-∞<n<+∞)是只取+I和-I变化的电流信号,对 于固定的n,,P{X(n)=+I}=P{X(n)=-I}=0.5,而正负号的变化是随机 的,在[n,n+m]时间内正负号变化的次数记为M(n,n+m).设M(n,n+m) 服从参数为λ,m的泊松分布,用VC编程求解:
• 实验原理
– 平稳随机过程数字特征求解的相关原理
RX(m)=I2e-2λ|m|; KX(m)= RX(m)-m2X (1)E(X(n))= I*P{X(n)=+I}+(-I)*P{X(n)=-I}=0 (2) R(m) E[ X (n) X (n m)] I 2 P{X (n) X (n m) I 2 } I 2 P{X (n) X (n m) 12 } 当 m 0 时,
– 函数功能:计算泊松过程的自相关序列 – 参数: lambda为泊松过程的参数, points为输 入随机数序列的个数。所有参数在 randomDlg.cpp的OnSelfStat () 函数中设置。 – 返回:函数返回一个动态分配的数组头指针, 产生的Rx序列保存于该数组中 – 注意:不要在本函数中释放该数组的内存
3
伪随机数
• 伪随机数的产生:用户只需给定一个初始的 随机数(种 子值),调用该算法,即可按某个固定的公式计算出下一 个“随机”数。随后,以新产生出来的“随机”数作为种 子,再计算出新的“随机”数。重复调用该算法即可产生 出一系列的“随机”数,以满足系统仿真的需要。 • 伪随机数本质上不是随机的。但只要计算公式选择得当, 通过比较严格地统计检验,仍然可以产生出一系列近似于 U(0,1)分布并且相对独立的随机数流,这种随机数流对于 大多数仿真模型,是能满足需要的。因此,仍然是目前广 泛应用的工程方法。
17
MyRand.cpp的函数
• double CMyRand::NormalRandom(double miu, double sigma, double min, double max)
– 函数功能:产生均值为miu,方差为sigma的正态分布 的随机数 – 参数: miu为均值, sigma为方差, min和max 为均匀 分布随机变量的取值范围。 所有参数在 randomDlg.cpp的OnNormal()和OnNormalStat()函数 中设置。 – 实现思路:利用中心极限定理,通过多个独立的均匀 随机变量之和构成正态随机变量