【问题标题】:Integrate a function in R through time通过时间在 R 中集成一个函数
【发布时间】:2015-04-10 21:54:04
【问题描述】:

我想整合以下关于 t 的函数,下限 = 0 和上限 = t。我可以使用以下代码做到这一点,但我的最终目标是为每个 t 设置一个积分值。即使我使 t 成为一个序列而不是一个值,或者如果我尝试使用 sapply,我仍然无法在 t 的每一步获得积分值。

#initialize constants
kap=-0.1527778
alph0<-6
b<-0
po<-0.01
t<-100
gp_st<-integrate(function(t) (1-alph0/(alph0+b*t)*(1-po^kap))^(1/kap),lower=0,upper=t)$value

#try alternate where t is now a sequence 
t<-seq(1:100)
gp_st2<-function(h) sapply(h,gp_st) #still gives length of 1

谢谢!

【问题讨论】:

    标签: r function apply integrate


    【解决方案1】:

    尝试将gp_st 设为上限的函数,如下所示:

    gp_st <- function(h) {
      integrate(function(t) (1-alph0/(alph0+b*t)*(1-po^kap))^(1/kap),lower=0,upper=h)$value
    }
    

    那么你可以按照你的意图使用 sapply:

    t<-seq(1:100)
    gp_st2 <- sapply(t, gp_st)
    

    现在gp_st2 是一个长度为 100 的数字向量。

    【讨论】:

    • 现在下一步...如果我想针对 b、po、kap、alph0 的几个值评估此函数...我猜有一种更有效的方法来做到这一点而不是为我想改变的每个参数在循环中嵌套应用语句?
    • 矢量化可能会起作用(在您想要尝试的所有值上使用矢量,并且输出是一个数组),但它在概念上可能不直观。循环遍历您想要尝试的不同参数组合并不一定是坏事——尝试一下,看看运行时是什么。
    【解决方案2】:

    问题是您正在评估 gp_st 中的积分,而您不想这样做。您需要以下内容:

    ff = function(t) {
      (1-alph0/(alph0+b*t)*(1-po^kap))^(1/kap)
    }
    sapply(1:100, function(ul) {
      integrate(ff, lower = 0, upper = ul)$value
    })
    

    自然有更有效的方法来做到这一点。

    【讨论】:

    • 谢谢,现在我想评估几个常量值(alph0、b、po、kap)的函数。您是否建议将这些存储在数据框中并为每个参数附加值?
    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多