Причина в , а не в том, что значения вашей функции 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
Это не имеет ничего общего с Vectorize
.И integrate
требует, чтобы его подынтегральное выражение было векторизовано.(Я немного сомневаюсь в абсолютной ошибке.)
Вы также можете попробовать 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
Тем не менее, он должен уметь «видеть» пик.