Ошибка вычисления площади между двумя строками с помощью «интегрировать»

#r #area #integral #integrate #curves

#r #площадь #интеграл #интегрировать #кривые

Вопрос:

Я пытаюсь вычислить площадь между двумя графиками, используя integrate функцию R. У меня есть две кривые прогноза, которые я могу разместить на одном графике, а также затенить область между двумя кривыми для визуализации:

 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. Вы можете увеличить количество subdivisions , но тогда вы, вероятно, получите ошибку округления. Вместо этого я бы предложил вычислить интеграл без приближений. Это не так сложно, используя некоторую геометрию.

Ответ №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
 

Ответ №2:

Является 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 как, затем попробуйте вторые две строки кода.

Комментарии:

1. Спасибо за ответ. В примере, который я включил из справочного форума R и где я получил исходный код, он был выполнен точно так, как я написал свой, и сами данные не слишком отличаются от моих собственных (seq, используемый на оси x, меньше, значения y похожи на мои собственные). При запуске используемого там примера я получаю точно такой же ответ, поэтому я не уверен, зачем мне нужно вносить изменения в мои, которые вы предлагаете.