2014-07-15 5 views
0

주어진 f와 input은 동일한 길이의 두 개의 숫자 벡터 x와 y를 생성합니다. 내 응용 프로그램의 경우 호출을 통해 이러한 벡터를 호출합니다.R 적분 : 세분의 수를 결정하십시오

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 

나는 이러한 오류의 모두 트리거 또는 구획의 수에 따라 서로 다른 입력에 전달할 것으로 나타났습니다 I 각 통화에 대해 선택하십시오. 나는 지난 3 시간 동안 시행 착오를 통해 내 전체 신청서가 끝날 가치를 결정하려고 노력했다. 적분을 실행할 수있는 각 호출에서 vector x와 y를 기반으로 세분화 된 값을 체계적으로 결정할 수있는 방법이 있습니까? 각 호출마다 똑같은 구획이 필요하지는 않습니다. 모든 인스턴스에서 좋은 근사값 만 있으면됩니다. 이 프로세스와 관련하여 통합 작업 방법에 대한 다른 정보도 매우 유용합니다. 참고로

, 내가 위해 시도 값이 있었다 : 나는 적절한 서브 인터벌을 결정하는 체계적인 방법을 찾을 수 없습니다 동안 100, 400, 200, 250, 300

+0

통합하려는 커브의 성격을 알지 못하면 제안하기가 어렵습니다. 어쩌면 범위의 함수 여야합니까? 당신의 기능은 평평합니까? 부드러운? – MrFlick

+0

'cubature' 패키지에서'adaptIntegrate (...) '을 시도해 볼 수도 있습니다. 다중 적분을 위해 설계되었지만 1D 적분에도 잘 작동합니다. 속도가 느리지 만 ([this post] (http://stackoverflow.com/questions/7924818/performance-of-adaptintegrate-vs-integrate)),보다 강력합니다. – jlhoward

답변

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을 사용하지만 네 가지 경우 사이에 프로그램이 실행될 수 있음이 드러났습니다.