【问题标题】:Integrating a function with two arguments in R在 R 中集成带有两个参数的函数
【发布时间】:2020-07-06 11:20:02
【问题描述】:

我有以下锥度函数:

taper <- function(midd,midh){
    midh <- midh+0.2
    tFactorSBD <-      1.3/midh
    qFactorSBD <-      (0/100)/midh
    YFactorSBD <-      (1-qFactorSBD^0.5)/(1-tFactorSBD^0.5)
    aux1SBD <-         0.6624965*(YFactorSBD^0.1)+ 0.3781478*(qFactorSBD^4)
    aux2SBD <-         -0.4418430*asin(1-sqrt(qFactorSBD))
    aux3SBD <-         -0.5154988/exp(midd/midh)
    aux4SBD <-         0.0197963*midd^YFactorSBD
    ExpFactorSBD <-    aux1SBD+ aux2SBD+ aux3SBD+ aux4SBD
    diam <- 0.8795844*(midd^0.9457765)*(midh^0.1061692)*(YFactorSBD^ExpFactorSBD)
    area<- pi*((diam/2)^2)/10000 
    return(area)
}

我想整合它来计算音量,从 0.2 到 midh(在我的示例中,我正在测试 15.1)。我试过这个:

volume <- integrate(taper, 0.2, 15.1, midd=13.5) 

但出现了这条消息:

Error in integrate(taper, 0.2, 15.1, midd = 13.5) : 
  non-finite function value

有什么提示吗?

【问题讨论】:

    标签: r integrate


    【解决方案1】:

    嗯,

    unlist(lapply(seq(0.2, 2.4, 0.1), function(x) taper(15.1, x)))
    

    给予

     [1]           NaN           NaN           NaN           NaN           NaN           NaN           NaN           NaN           NaN           Inf           Inf           Inf
    [13]           Inf           Inf           Inf           Inf           Inf           Inf           Inf           Inf           Inf           Inf 9.064414e+221
    

    所以taper 将返回NaNInf,以获取低于约2.3 的midh 的值。这就是你不能积分的原因:积分是未定义的。你需要弄清楚taper 应该返回什么。

    另外,请注意integrate 为其参数f 提供第一个 参数,在您的情况下为taper。你需要提供其他人。但是taper 的第一个参数是midd。所以这被通过了两次(一次是integrate,一次是你)。 midh 从未定义过。

    函数的第一行 midh &lt;- midh+0.2 看起来很奇怪。

    qFactorSBD &lt;- (0/100)/midh 的意思是qFactorSBD 定义为0

    【讨论】:

    • Ops,对不起,我用新答案回复了您的评论!
    • 请您发布输入数据的样本好吗? (dput() 在您的数据框上运行的输出将是理想的。或者,如果它太大,dput(head())。)请您解释一下您的taper 函数试图做什么?此外,使用integrate 时不涉及“模拟”。谷歌“梯形规则”如果你想要一个数值积分的例子。 integrate 不使用梯形规则,但同样适用。
    • > dput(head(StandData)) 结构(list(Stand = c("s3 .", "s3 .", "s3 .", "s3 .", "s3 .", " s3 ."), 年龄 = c(44, 45, 46, 47, 48, 49), SAge = c(44, 45, 46, 47, 48, 49), Sumvol = c(272, 275.6, 279.2, 282.8) , 286.4, 290), Midd = c(13.5, 13.88, 14.26, 14.64, 15.02, 15.4), Midh = c(15.3, 15.58, 15.86, 16.14, 16.42, 16.7)), row.names = c(NA, - 6L ), class= c("tbl_df", "tbl", "data.frame"))
    • 锥度函数计算给定高度的树的直径。用这个直径,我计算出对应于那个直径的面积。积分函数应该计算整棵树的体积,从 0.2 厘米到总高度。我会用谷歌搜索。谢谢!
    【解决方案2】:

    感谢您的回复。是的,你是对的。锥度函数有一些问题。 我认为它现在可以工作了:

    taper <- function(x,midh,midd){
      tFactorSBD <-      1.3/midh
      qFactorSBD <-      x/midh
      YFactorSBD <-      (1-qFactorSBD^0.5)/(1-tFactorSBD^0.5)
      aux1SBD <-         0.6624965*(YFactorSBD^0.1)+ 0.3781478*(qFactorSBD^4)
      aux2SBD <-         -0.4418430*asin(1-sqrt(qFactorSBD))
      aux3SBD <-         -0.5154988/exp(midd/midh)
      aux4SBD <-         0.0197963*midd^YFactorSBD
      ExpFactorSBD <-    aux1SBD+ aux2SBD+ aux3SBD+ aux4SBD
      diam <- 0.8795844*(midd^0.9457765)*(midh^0.1061692)*(YFactorSBD^ExpFactorSBD)
      area<- pi*((diam/2)^2)/10000
      return(area)
    }
    
    vol <- integrate(taper, 0.2, 15.1, midh=15.1, midd=13.5)$value
    print(vol)
    
    

    我对积分一点也不熟悉,但我认为“x”是要模拟的值,范围从 0.2 到 midh。

    问题是我有一个包含数百种 midh 和 midd 组合的数据框,我必须为所有这些组合计算“vol”。

    我现在苦苦挣扎的部分是如何将积分函数插入一个循环中,该循环将为我提供 midh 和 midd 的每种组合的所有 vol 值。

    有什么提示吗?

    感谢您花时间帮助 R =) 的初学者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多