2016-10-17 8 views
0

Я пытаюсь вычислить площадь между двумя графиками, используя функцию R. У меня есть два прогноза кривые, которые я могу разместить на том же участке, а также тень в области между двумя кривыми, для визуализации:Ошибка вычисления области между двумя строками с помощью «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 я пытался выполнить то же самое код для моих данных для расчета между двумя кривыми. Как указано в примере «область между двумя кривыми такая же, как интеграл от разности между этими двумя кривыми (соответственно абсолютных значений.)»:

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

integrate(f2, 1, 200) 

Однако я получаю следующую ошибку:

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

Оцените любую ясность, которую можно пролить на это. Благодаря!

+1

Вы можете увеличить количество «подразделений», но тогда вы, скорее всего, получите ошибку округления. Вместо этого я предлагаю вычислить интеграл без приближений. Это не так сложно, используя некоторую геометрию. – Roland

ответ

0

approxfun() возвращение функции? Вы должны иметь разницу f1 и f2 сохранены как функция, а не набор разностей точек. Например

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) 

Попробуйте выражающее f1 и f2 как тогда функции попробовать вторые две строки кода.

+0

Спасибо, что ответили. В примере, который я включил в справочный форум R, и где я получил исходный код, он был выполнен точно так же, как я написал мой, и сами данные не слишком отличаются от моих собственных (секция, используемая на оси x, меньше, 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