2016-10-17 16 views
0

R의 integrate 함수를 사용하여 두 개의 플롯 사이의 면적을 계산하려고합니다."integrate"를 사용하여 두 줄 사이의 면적을 계산하는 중 오류가 발생했습니다

x1 = seq(1,200,1) 
y1 = # 200 numbers from 0.02 - 1.000 
y2 = # 200 numbers from 0.00 - 0.95 

plot(x1,y1,type="l",bty="L",xlab="Forecast Days",ylab="Curve Actuals") 
points(x1,y2,type="l",col="red") 

polygon(c(x1,rev(x1)),c(y2,rev(y1)),col="skyblue") 

내가 같은를 실행하려고했습니다 여기에 예를 https://stat.ethz.ch/pipermail/r-help/2010-September/251756.html 다음은 내가 시각화, 두 곡선 사이의 영역에도 그늘을 같은 플롯에 배치하고 할 수있어이 예측 곡선이 내 데이터를 계산하는 코드는 두 곡선 사이에 있습니다. 예 에 명시된 바와 같이 "(. RESP 절대 값) 두 개의 곡선 사이의 면적은 두 곡선의 차이의 적분과 동일하다" :

f1 = approxfun(x1, y1-y2)  # piecewise linear function 
f2 = function(x) abs(f1(x)) # take the positive value 

integrate(f2, 1, 200) 

I가 다음 오류 그러나 :

Error in integrate(f2, 1, 200) : maximum number of subdivisions reached 

이 점에 대해 명확히 이해하십시오. 감사!

+1

'세분'수를 늘릴 수는 있지만 반올림 오류가 발생할 수 있습니다. 대신 approximations없이 integral을 계산할 것을 제안합니다. 일부 지오메트리를 사용하는 것은 그렇게 어렵지 않습니다. – Roland

답변

0

approxfun()은 함수를 반환합니까? 차이점을 설정하지 않고 f1f2의 차이점을 함수로 저장해야합니다. 함수는 다음 코드의 두 번째 두 줄을 시도 예를 들어

f1 <- function(x) { 2 * x - 1} 
f2 <- function(x) { x^2 - 3 * x} 
abs_dif <- function(x) { abs(f1(x) - f2(x)) } 
integrate(abs_dif, -1, 1) 

f1f2을 표현하십시오.

+0

응답 해 주셔서 감사합니다. R 도움말 포럼에 포함 된 예제에서 원본 코드를 얻은 곳에서이 코드는 제가 작성한 것과 똑같이 실행되었고 데이터 자체는 너무 닮지 않았습니다 (x 축에 사용 된 seq는 더 작습니다. y 값은 내 자신과 비슷합니다.) 거기에서 사용 된 예제를 실행할 때, 나는 똑같은 대답을 얻었습니다. 그래서 당신이 제안한 것을 변경해야하는 이유가 확실하지 않습니다. – Qaribbean

1

@Roland의 이전 주석에서 제안 된 것처럼 세분화 된 수를 늘리면 올바르게 실행됩니다. 그것은 절대적인 오류를 일으키지 만 매우 미세합니다.

f1 = approxfun(x1, y1-y2)  # piecewise linear function 
f2 = function(x) abs(f1(x)) # take the positive value 

area1 = integrate(f2, 1, 200, subdivisions = 300) 
> area1 
9.327692 with absolute error < 8.1e-05 
+0

정답 인 것 같습니다. – BonStats