我有一个给定的函数f,输入产生两个相同长度的数值向量x和y。对于我的应用程序,我通过调用
将这些向量传递给aproxfunreturn(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
答案 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进行快速测试。