Интегрируйте возвращение 0 для кривой в R - PullRequest
0 голосов
/ 20 сентября 2018

Мне было интересно, почему integrate в приведенном ниже коде для кривой, которую я показываю ниже, возвращает 0?

Я предполагаю, что это как-то связано с Vectorize, ноесть исправление?

L = Vectorize(function(x) prod(dnorm(c(250, 265, 259), mean = x, sd = 2)))

curve(L, 252, 263)

integrate(L, -Inf, Inf)[[1]] ## why gives '0' ## is it due to `Vectorize`? 

enter image description here

1 Ответ

0 голосов
/ 21 сентября 2018

Причина в , а не в том, что значения вашей функции L слишком малы.Вы интегрируете в огромном диапазоне от -Inf до Inf, что затрудняет для процедуры числовой интеграции фактическое "видеть" этот пик в области интеграции.

Пик будет распознаваться integrateесли вы переместите его на 0, так как процедура будет выглядеть там с уверенностью.

L = Vectorize(function(x) prod(dnorm(c(250, 265, 259),
              mean = x + 258, sd = 2)))
# curve(L, -10, 10)

integrate(L, -Inf, Inf)
## 1.487655e-08 with absolute error < 1.1e-10

Это не имеет ничего общего с Vectorizeintegrate требует, чтобы его подынтегральное выражение было векторизовано.(Я немного сомневаюсь в абсолютной ошибке.)

Вы также можете попробовать quadinf в пакете pracma , который обрабатывает бесконечные области интеграции и не требует векторизации функции.

f = function(x)
        prod(dnorm(c(250, 265, 259), mean = x + 258, sd = 2))
pracma::quadinf(f, -Inf, Inf)$Q
## [1] 1.487658e-08

Тем не менее, он должен уметь «видеть» пик.

...