0

这是我正在处理的 PDF:

fx = 0.3 if (0<=x<1)
0.1 if (1<=x<2)
0.25 if (2<=x<3)
0.15 if (3<=x<4)
0.2 if (4<=x<5)
0 otherwise 

我必须编写一个函数 gen_xy ,它将生成一系列点 (X, Y) 均匀分布在 (0, 5) X (0, 0.5) 中,直到一个位于y = fx(x).

到目前为止,这是我的代码:

fx <- function(x) c(0, 0.3,0.1,0.25,0.15,0.20, 0)
[findInterval(x, c(-Inf, 0:5,  Inf))]

x <- runif(n,0,5)
fx <- stepfun(x = 0:5, y = c(0,0.3,0.1,0.25,0.15,0.20,0))
plot(fx, ylim = c(0,0.5),xlim = c(0,5), main = 'f(x)')

现在这是我为我的函数编写代码的尝试:

gen_xy <- function() {
    done=0
    while(done==0) {
        x=runif(1,0,5)
         y=runif(1,0,0.5)
         print(c("x,y",c(x,y)))
         if(y < fx(x)) {
             done=1
         }
    }
    xy=c(x,y)
    xy
}

但我认为这部分if(y < fx)是错误的?

然后,我需要生成 1000 个点的样本并绘制它们以检查它们是否是y=fx. 我将如何编写这样的代码?

4

1 回答 1

0

您的gen_xy()函数按照我的理解执行您希望它执行的操作...生成一系列点,直到一个点位于该线下方...然后跳出循环。我试过了,通常它只产生几个点......如果你points(x,y,col="red")在你的循环中做广告或类似的东西,你可以将它们添加到你的情节中。

要生成 1000 分,您可以执行以下操作:

     x=runif(1000,0,5)
     y=runif(1000,0,0.5)

然后你可以把它放在你的情节上points(x,y)

但我不确定你对适当样本的意思。??

您可以再次将生成的点与曲线进行比较:

     y < fx(x)

并将它们作为 x[y < fx(x)] 和 y[y < fx(x)] 的子集。

于 2013-04-19T09:02:00.300 回答