我必须编写以下方法的函数:
拒收方式(统一包络):
假设 fx 仅在 [a, b] 和 fx ≤ k 上非零。
生成与 X 无关的 X ∼ U(a, b) 和 Y ∼ U(0, k)(因此 P = (X, Y ) 均匀分布在矩形 [a, b] × [0, k] 上)。
如果 Y < fx(x) 则返回 X,否则返回步骤 1。
rejectionK <- function(fx, a, b, K) { # simulates from the pdf fx using the rejection algorithm # assumes fx is 0 outside [a, b] and bounded by K # note that we exit the infinite loop using the return statement while (TRUE) { x <- runif(1, a, b) y <- runif(1, 0, K) if (y < fx(x)) return(x) } }
我一直不明白为什么会TRUE
这样 while (TRUE)
?
如果 (y < fx(x)) 不正确,则该方法建议再次重复循环以再次生成统一数。(y < fx(x)) 不为真=假。那么为什么不会出现这种情况while (FALSE)
呢?
再次,我将在哪个基础上进入 while 循环?也就是说,我习惯了这个
a=5
while(a<7){
a=a+1
}
在这里,我在编写条件 (a<7) 之前定义了 a 。
但是while (TRUE)
,哪一个说法是正确的?
此外:
你可以运行代码
rejectionK <- function(fx, a, b, K) {
# simulates from the pdf fx using the rejection algorithm
# assumes fx is 0 outside [a, b] and bounded by K
# note that we exit the infinite loop using the return statement
while (TRUE) {
x <- runif(1, a, b)
y <- runif(1, 0, K)
cat("y=",y,"fx=",fx(x),"",y < fx(x),"\n")
if (y < fx(x)) return(x)
}
}
fx<-function(x){
# triangular density
if ((0<x) && (x<1)) {
return(x)
} else if ((1<x) && (x<2)) {
return(2-x)
} else {
return(0)
}
}
set.seed(123)
rejectionK(fx, 0, 2, 1)