Brent-Dekker间隔(实践)

时间:2017-01-26 22:42:35

标签: r algorithm statistics

我使用pracma包,特别是Brent-Dekker根寻找算法,搜索根到一个函数,该函数设置观察变异系数(CV obs)等于模拟(CV sim)。

虽然在个人基础上我可以对算法提供初始间隔的良好估计(例如brent(f, a, b)中的[a,b]),但我正在处理大量的年/区/等。为此我找到了根,并且间隔范围不那么宽容 - 就我遇到的情况而言,它需要非常狭窄。以下是我的代码的一般要点:

library(pracma)
CV <- function(x){ #coefficient of variation
  sd(x)/mean(x)
}
fb <- function(b){ #this is my function
  CV(obs)-CV(sim^b)
}
for (i in ...) { #regions
    for (j in ...) { #years... etc. 
      obs <- some.dataframe
      sim <- some.df.2
      z1 <- brent(fb, 0.5,2) #where z1$root is the solution
    }
 }

我想知道是否有相关的包或方法来确定我的for循环中的初始间隔,或者是否有修改以便我可以将此间隔留空(我不使用Python但是例如{{3}间隔是可选的)。

我希望有意义,乐于提供更多背景信息。

1 个答案:

答案 0 :(得分:0)

我不知道这是否符合您的要求,但scanf()使用(某种形式)布伦特的方法:archive pointed to by ?stats::uniroot说:

  

此文件包含Brent的单变量最小化器和零查找器。
   C实现(适应)算法
  G.Forsythe,M.Malcolm,C.Moler,计算机方法   数学计算。

stats::uniroot有一个uniroot()参数,默认为“no”,但可以设置为“yes”:

  

extendInt:字符串,指定间隔'c(lower,upper)'   当'f()'时应该扩展或直接产生错误   在端点没有不同的标志。

因此您不能将间隔留空,但算法会尝试优雅地调整为“不良”选择。