首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R integrate:确定细分数

R integrate:确定细分数
EN

Stack Overflow用户
提问于 2014-07-16 07:48:29
回答 2查看 1.3K关注 0票数 1

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

代码语言:javascript
复制
return(integrate(approxfun(x,y), range(x)[1], range(x)[2], subdivisions = 300))

我在大约1000个不同的数据点上执行这个过程。出现的问题是我一直收到以下两个错误中的一个:

代码语言:javascript
复制
Error in integrate(....): maximum number of subdivisions reached

代码语言:javascript
复制
Error in integrate(...): extremely bad integrand behavior

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

作为参考,我尝试的值依次为: 100、400、200、250、300

EN

回答 2

Stack Overflow用户

发布于 2014-07-17 02:44:14

虽然我不能找到一种系统的方法来确定适当的子间隔,但我使用R的try()函数找到了解决我的特定问题的方法。下面是详细介绍我所做的工作的代码:

代码语言:javascript
复制
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)
}

基本上,我尝试了不同的细分值,直到其中一个给出了数字答案,利用了这样一个事实:如果try失败,它将生成一个列表,该列表的第一个条目是类字符。我使用stopifnot退出,以防细分用例都不起作用,但事实证明,在这四个用例之间,我的程序能够执行。

票数 2
EN

Stack Overflow用户

发布于 2020-05-31 22:34:03

当这个错误突然出现在我面前时,我偶然发现了这篇文章。我只想分享我发现的最简单的事情,就是明显地增加细分的数量(因为错误很明显这就是问题所在)。对于不好的行为,我认为平滑你的数据,然后估计函数每次都有效。问题可能是数据有噪声等

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24769992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档