我想绘制一个包含整体
的函数# 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
我不明白这意味着什么。我希望你有一个暗示我。
答案 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)
这里有几件事情。
r
,而不是x
。 integrate(...)
将f
与第一个参数的值相集成,因此您需要将参数的顺序切换为f
。integrate(...)
返回包含多个元素的列表。其中一个是value
,即积分的值。所以要获得它,你需要参考integrate(...)$value
。阅读the documentation。plot(...)
与函数一起使用,则需要对该函数进行矢量化。也就是说,它需要将一个向量作为参数并返回相同长度的向量。 integrate(...)
函数是R中未被向量化的少数函数之一。幸运的是,有一个特殊函数Vectorize(...)
用于将标量值函数转换为向量函数。全力以赴:
# 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
,所以我真的不明白这样做的意义。然而,这就是代码的工作方式。