我想画一个函数,其中包括一个整体
# 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
我不明白这意味着什么。我希望你能给我个提示。
发布于 2014-04-10 08:43:48
这里发生了几件事。
r
上进行集成,而不是x
。integrate(...)
在第一个参数的值上集成了f
,因此您需要将参数的顺序切换到f
。integrate(...)
返回一个包含多个元素的列表。其中之一是value
,积分的值。因此,要获得这个结果,您需要参考integrate(...)$value
。读文献资料。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
,所以我真的不认为这样做有什么意义。然而,这就是代码的工作方式。
发布于 2014-04-10 08:03:56
您的h函数返回一个包含许多变量的列表,而不是一个可以绘制的点。
不清楚您在做什么,因为h(x)只是返回x,因为它是在R上进行集成,而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)
这也许是个更好的方法。
https://stackoverflow.com/questions/22992947
复制相似问题