嗨,我坚持使用函数的数值积分。我有这个功能:
Nd_f <- function(a,t) {
theta(t-a)*exp(-l*(1-exp(-a))) }
用于下面定义的另一个函数:
Nd <- function(s) {
integrate(Nd_f, lower = 0, upper = s, t=s)$value }
其中,theta()是已知函数。所以,使用这些函数我可以评估Nd(t)。但是当我尝试用它绘图时:
plot(Nd(0:500), log="y")
我收到以下错误:
积分错误(Nd_theta,lower = 0,upper = s,t = s): 功能评估给出了错误长度的结果
我不明白我是否可以根据t的所有值来评估它,为什么我无法绘制它?
l = 0.025,v = 0.001和
theta <- function(t) { exp(-v*t) }
提前致谢!
答案 0 :(得分:6)
我假设theta = exp
和l = r = 1
,所以:
Nd_f <- function(a,t) exp(t-a)*exp(-(1-exp(-r*a)))
函数Nd <- function(s) integrate(Nd_f, lower = 0, upper = s, t=s)$value
旨在评估积分:
请注意integrate
不是矢量化函数。 矢量化函数可以采用矢量输入,并返回一个矢量。例如,exp
函数是矢量化的,因为:
exp(1:3)
# [1] 2.718282 7.389056 20.085537
但integrate
不是。您只能传入lower
和upper
的标量。所以,如果您这样做,则没有问题:
Nd(1)
# [1] 1.273614
但是当你这样做时它不起作用:
Nd(1:2)
# [1] 2.286086
# There were 15 or more warnings (use warnings() to see the first 15)
# warnings()
# Warning messages:
# 1: In t - a : longer object length is not a multiple of shorter object length
你需要结束标量函数Nd
以获得矢量化函数。如果你真的是R的新手,你可以使用for
循环:
Nd_vectorized_for <- function(s) {
result <- numeric(length(s))
for (i in 1:length(s)) {
result[i] <- Nd(s[i])
}
result ## or `return(result)`
}
现在这个函数可以采用向量输入并返回一个向量:
Nd_vectorized_for(1:2)
# [1] 1.273614 4.276839
对R更有经验的人会建议将for
循环替换为*apply
家庭功能(阅读?sapply
以查看此系列):
Nd_vectorized_sapply <- function(s) sapply(s, Nd)
Nd_vectorized_sapply(1:2)
# [1] 1.273614 4.276839
但是integrate
不是一个便宜的操作,所以sapply
没有性能提升:
system.time(Nd_vectorized_for(sample(1:10,100000,replace=TRUE)))
# user system elapsed
# 6.256 0.004 6.268
system.time(Nd_vectorized_sapply(sample(1:10,100000,replace=TRUE)))
# user system elapsed
# 6.200 0.004 6.212
使用矢量化函数,您可以生成所需的图:
plot(Nd_vectorized_for(1:50), log = "y")