R整合:确定细分数量

时间:2014-07-15 23:48:29

标签: r integrate

我有一个给定的函数f,输入产生两个相同长度的数值向量x和y。对于我的应用程序,我通过调用

将这些向量传递给aproxfun
return(integrate(approxfun(x,y), range(x)[1], range(x)[2], subdivisions = 300))

我正在〜1000个不同的数据点上执行此过程。发生的问题是我一直遇到两个错误之一:

Error in integrate(....): maximum number of subdivisions reached

Error in integrate(...): extremely bad integrand behavior

我发现这两个错误都会触发或传递不同的输入,具体取决于我为每个调用选择的细分数量。过去三个小时我通过反复试验来尝试确定整个应用程序完成的值。有没有办法根据允许集成执行的每次调用的向量x和y系统地确定细分值?对于每次调用,我不一定需要细分是相同的,我只需要在每个实例都有一个很好的近似值。关于集成如何在此过程中工作的任何其他信息也将非常有用。

作为参考,我按顺序尝试的值是:100,400,200,250,300

2 个答案:

答案 0 :(得分:1)

虽然我无法找到确定适当子区间的系统方法,但我找到了使用R的try()函数解决我的具体问题的方法。这是详细说明我所做的代码:

integrateArea = function(myvect, interval = 300) {
  x = seq(0, 300*(length(myvect) - 1), 300)
  y = myvect
  returnvalue = 'a'
  returnvalue = try((integrate(approxfun(x,y), range(x)[1], range(x)[2], subdivisions = 350)))
  if(class(returnvalue) != "numeric") {
    returnvalue = try((integrate(approxfun(x,y), range(x)[1], range(x)[2], subdivisions = 400)))[[1]]
  }
  if(class(returnvalue) != "numeric") {
    returnvalue = try((integrate(approxfun(x,y), range(x)[1], range(x)[2], subdivisions = 300))) [[1]]
  }
  if(class(returnvalue) != "numeric") {
    returnvalue = try((integrate(approxfun(x,y), range(x)[1], range(x)[2], subdivisions = 200))) [[1]]
  }
  if(class(returnvalue) != "numeric") {
    returnvalue = try((integrate(approxfun(x,y), range(x)[1], range(x)[2], subdivisions = 100))) [[1]]
  }
  stopifnot(class(returnvalue) == "numeric")
  return(returnvalue)
}

基本上,我尝试了不同的细分值,直到有人给出了一个数字答案,利用了如果尝试失败的事实,它将产生一个第一个条目是类字符的列表。我使用stopifnot退出以防所有细分案例都没有工作,但事实证明,在这四种情况之间,我的程序能够执行。

答案 1 :(得分:0)

当我看到此错误时,我遇到了这篇文章。只想分享我发现最简单的方法就是,显然增加了细分的数量(因为错误很明显就是问题所在)。而且对于不良行为,我认为您每次都要理顺您的数据,然后估算该功能是否有效。问题可能出在数据等方面

我几乎总是使用带有非常保守参数的signal :: sgolayfilt进行快速测试。