多变量函数的数值积分

时间:2016-07-03 12:29:18

标签: r function plot numeric numerical-integration

嗨,我坚持使用函数的数值积分。我有这个功能:

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) }

提前致谢!

1 个答案:

答案 0 :(得分:6)

我假设theta = expl = 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旨在评估积分:

enter image description here

请注意integrate不是矢量化函数。 矢量化函数可以采用矢量输入,并返回一个矢量。例如,exp函数是矢量化的,因为:

exp(1:3)
# [1]  2.718282  7.389056 20.085537

integrate不是。您只能传入lowerupper的标量。所以,如果您这样做,则没有问题:

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")

enter image description here