在R中绘制积分

时间:2014-04-10 15:52:26

标签: r

我想绘制一个包含整体

的函数
# intergrand f
f <- function(r,x) x*exp(-r)

# integral
h <- function(x) {
    integrate(f, lower=0, upper=Inf, x=x)
}

plot(h, xlim=c(-2:4), xlab="x", ylab="y", col="red")

但是,我收到以下错误消息:

Error in integrate(f, lower = 0, upper = Inf, x = x) : 
  evaluation of function gave a result of wrong length
In addition: Warning message:
In x * exp(-r) :
  longer object length is not a multiple of shorter object length

我不明白这意味着什么。我希望你有一个暗示我。

2 个答案:

答案 0 :(得分:2)

你的h函数返回一个包含许多变量的列表,而不是一个可以绘制的点。

目前尚不清楚你在做什么,因为h(x)只是返回x,因为它整合在R上,它整合到1。

修正后的代码是:

h<-function(x){
  x
}
plot(h, xlim=c(-2,4), xlab="x", ylab="y", col="red")

请注意xlim已更改,以及功能。如果要整合x而不是R,请注意积分是

.5*exp(-r)*(x^2)

这可能是更好的方法。

答案 1 :(得分:2)

这里有几件事情。

  1. 您希望整合r,而不是xintegrate(...)f第一个参数的值相集成,因此您需要将参数的顺序切换为f
  2. integrate(...)返回包含多个元素的列表。其中一个是value,即积分的值。所以要获得它,你需要参考integrate(...)$value。阅读the documentation
  3. 如果您要将plot(...)与函数一起使用,则需要对该函数进行矢量化。也就是说,它需要将一个向量作为参数并返回相同长度的向量。 integrate(...)函数是R中未被向量化的少数函数之一。幸运的是,有一个特殊函数Vectorize(...)用于将标量值函数转换为向量函数。
  4. 全力以赴:

    # intergrand f
    f <- function(r,x) x*exp(-r)   # order of arguments reversed
    # integral
    h <- function(x) integrate(f, lower=0, upper=Inf, x=x)$value
    g <- Vectorize(h)
    x <- seq(-2,4,.1)
    plot(x,g(x), xlim=c(-2,4), xlab="x", ylab="y", col="red")
    

    正如在另一个答案中所指出的,将x*exp(-r)r [0,Inf]相结合会产生x,所以我真的不明白这样做的意义。然而,这就是代码的工作方式。