【统计模拟及其R实现】逆变换 / 筛选法 / 合成法 上机习题答案(超详细)

课本:统计模拟及其R实现 - 肖枝红,朱强 武汉大学出版社

参考课件:第三章 随机数 - 浙江大学数学科学学院

目录

1. 逆变换法

2. 筛选法

3. 合成法


 1. 逆变换法

题目1:用逆变换方法生成如下密度函数的随机变量,要求写出R程序:Cauchy概率密度函数  f(x) = \frac{1}{\pi(1 + x^{2})}

解:

首先求得Cauchy分布函数  \int_{-\infty}^{x} f(x)dx = F(x) = \frac{1}{\pi} arctanx + \frac{1}{2}

记 x = F^{-1}(u) 

则有 u = F(x) = \frac{1}{\pi} arctanx + \frac{1}{2}  

从上式中反解出x,得  x = tan[\pi (u - \frac{1}{2})] 

故可以通过生成随机变量U后,令 X = tan[\pi (U - \frac{1}{2})]  即可得到随机变量X的模拟值.

代码:

t1 = function(n) {
  U = runif(N)
  X = tan(pi*(U-0.5))
  X
}

t1(10) # 生成10个随机变量X

题目2:用逆变换方法生成如下概率函数的随机变量,要求写出R程序:P\{X = i\} = \frac{1}{i + 1} , i = 1,2,3,...

解:

令 X = i

若  \frac{i - 1}{i + 1} \leqslant U < \frac{i}{i + 1}  成立,就可以得到X的值

令 \frac{i - 1}{i + 1} = U ,将i反解,得到 i = \frac{1 + U}{1 - U}

故可以通过生成随机变量U后,令   即可得到随机变量X的模拟值.

代码:

t2 = function(n) {
  U = runif(n)
  X = floor((1+U)/(1-U))
  X
}

t2(10)

2. 筛选法

题目1:用筛选法来模拟如下密度函数的随机变量,f(x)是需要模拟的随机变量密度函数,g(x)是其对应的筛选函数:

f(x) = \frac{e^{-\frac{1}{2} x^2}}{1 + x^2}, g(x) = e^{-\frac{1}{2} x^2}

解:

算法步骤如下:

① 生成密度函数为g的随机变量Y

② 生成随机数U

③ 如果 U \leqslant \frac{f(x)}{cg(x)} ,令X=Y,否则转至步骤①

代码:

t3 = function(n) {
  x = 1; x[2] = 1
  for (i in 1:n) {
    repeat {
      u1 = runif(1)
      y = sqrt(-2*log(u1))
      u2 = runif(1)
      if (u2 <= 1/(1+y^2)) {
        x[i] = y
        break
      }
    }
  }
  x
}

t3(10)

题目2:令X是一个均值为1 的指数随机变量,给出一个有效算法来模拟一个随机变量,其分布函数为给定的X<0.05条件下的X的条件分布,也就是它的密度函数为:

f(x) = \frac{e^{-x}}{1-e^{-0.05}}

解:

选择筛选法进行随机变量模拟,选择 g(x) = e^{-x} ,则有

 \frac{f(x)}{g(x)} \leqslant \frac{1}{1-e^{-0.05}} = c  成立,接下来可使用题目1中的步骤进行解答.

代码:

t4 = function(n) {
  x = 1; x[2] = 1
  for (i in 1:n) {
    repeat {
      u1 = runif(1)
      y = -log(u1)
      u2 = runif(1)
      if (u2 <= 1/(1-exp(-0.05)) & y>0 & y<0.05) {
        x[i] = y
        break
      }
    }
  }
  x
}

t4(10)

3. 合成法

题目:假设随机变量X分别依照概率 0.06, 0.06, 0.06, 0.06, 0.06, 0.15, 0.13, 0.14, 0.15, 0.13 取值 1, 2, ..., 10. 用合成法产生X值

解:

题目中给出的分布律为:

X 1 2 3 4 5 6 7 8 9 10
P 0.06 0.06 0.06 0.06 0.06 0.15 0.13 0.14 0.15 0.13

观察可得,相同概率的数字有:

1 2 3 4 5 - 概率为0.06,分布律记为X1

6 9 - 概率为0.15,分布律记为X2

7 10 - 概率为0.13,分布律记为X3

8 - 0.14

创建X1的分布律:

X 1 2 3 4 5
P 0.2 0.2 0.2 0.2 0.2

创建X2的分布律:

X 6 9
P 0.5 0.5

创建X3的分布律:

X 7 10
P 0.5 0.5

算法思路:

① 产生两个均匀分布的随机数u1 u2

② 当 u1 <= 0.3,令 X = 1*floor(5*u2) + 1

(1*floor意思是1 2 3 4 5 6的间隔为1,5*u2意思是0.2*5=1,+1的意思是起始值为1,后面以此类推)

③ 当 u1 <= 0.6,令 X = 3*floor(2*u2) + 6

④ 当 u1 <= 0.86,令 X = 3*floor(2*u2) + 7

⑤ 当 u1 为其他值时,令 X = 8

代码:

t5 = function(n) {
  x = 0; x[2] = 0
  for (i in 1:n) {
    u1 = runif(1); u2 = runif(2)
    if (u1 <= 0.3) {
      x[i] = floor(5*u2)+1
    } else if (u1 <= 0.6) {
      x[i] = 3*floor(2*u2)+6
    } else if (u1 <= 0.86) {
      x[i] = 3*floor(2*u2)+7
    } else {
      x[i] = 14
    }
  }
  x
}

t5(10)

后记

本人为零基础小白,努力学习中,发布的文章难免有错误及纰漏之处,欢迎各位看官批评指正!

你可能感兴趣的:(统计模拟及其R实现,算法,概率论)