0

所以这是我的函数计算的 PDF:

fx = 0.3 如果 (0<=x<1) 0.1 如果 (1<=x<2) 0.25 如果 (2<=x<3) 0.15 如果 (3<=x<4) 0.2 如果 (4<=x< 5) 否则为 0


这是我的编码:

    fx = function(x)
    { 
    if ((0<=x) & (x<1)) 0.3
    else if ((1<=x) & (x<2)) 0.1
    else if ((2<=x) & (x<3)) 0.25
    else if ((3<=x) & (x<4)) 0.15
    else if ((4<=x) & (x<5)) 0.2
    else 0
    }


现在我将如何绘制 y=fx?
我试过了:

    x <- runif(n,0,5)
    y <- fx(x)
    plot(x, y, type='1', xlim=c(0,5), ylim=c(0,5))

但是我得到一个错误,“x”和“y”的长度不同?

4

2 回答 2

6

您的问题归结为您的函数没有正确矢量化(它不能很好地处理矢量)。

如果您使用 上一个问题中关于完全相同的问题的公认解决方案,那么您将不会遇到任何问题

例如

# a solution that will work and be properly vectorized
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)

plot(x, fx(x))

如果你想绘制一个阶梯函数(这就是这个pdf),你可以使用stepfun

例如

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.4),xlim = c(0,5), main = 'f(x)')

在此处输入图像描述

如果您不想添加积分,那么

plot(fx, ylim = c(0,0.4),xlim = c(0,5), main = 'f(x)', do.points=FALSE)

如果要矢量化阶跃函数,请使用Vectorize

 vfx <- Vectorize(fx)
于 2013-04-18T00:48:21.557 回答
1

您的 PDF 未矢量化。尝试这个:

fx <- function(x) {
  ifelse((0<=x) & (x<1), 0.3,
  ifelse((1<=x) & (x<2), 0.1,
  ifelse((2<=x) & (x<3), 0.25,
  ifelse((3<=x) & (x<4), 0.15,
  ifelse((4<=x) & (x<5), 0.2,
  0)))))
}

x <- seq(0, 6, length.out=n)
plot(x, fx(x))
于 2013-04-18T00:41:00.567 回答