У меня возникли проблемы с интегралом, который, насколько я могу судить, должен вести себя хорошо, но неправильно возвращает 0
, когда я пытаюсь интегрировать от -Inf
до Inf
. Рассмотрим следующий код R:
t = 466
N = 50
df = 198
rscale = sqrt(2)/2
delta = seq(50, 80, len=100)
log.const=-13.94309
f = Vectorize(function(delta,t,N,df,rscale,log.const=0)
exp(dt(t,df,ncp=delta*sqrt(N),log=TRUE) + dcauchy(delta,scale=rscale,log=TRUE) - log.const),
"delta")
integrate(f, -Inf, Inf, t = t, N = N,
df = df, rscale = rscale, log.const = log.const)
Этот интеграл возвращает 0. Функция выглядит хорошо, судя по графику:
plot(delta,f(delta,t,N,df,rscale,log.const), ty='l')
и если я интегрирую с «разумным» диапазоном, интеграл будет правильным:
integrate(f, 50, 80, t = t, N = N,
df = df, rscale = rscale, log.const = log.const)
И все отлично работает, если вместо этого установить t=465
! Почему у integrate()
могут быть проблемы с этим интегралом? Кажется, у него проблемы с поиском массы функции, но я не знаю, как указать функции integrate()
, где искать. Возможно, есть другой численный подход, который я могу использовать?
integrate()
отбирает только (обязательно) конечное число точек, и если вам не повезет, ни одна из них не попадет в не- нулевая часть вашего интеграла. Вы также можете уменьшить допуск (rel.tol), но здесь этого недостаточно. - person baptiste   schedule 04.12.2014-Inf,Inf
, количество точек выборки в регионах, где ваша функция имеет приличное значение, может упасть до точки, при которой результат будет плохим. Поскольку вы знаете, что ваша функция практически равна нулю в большей части диапазона, почему бы просто не проинтегрировать некоторые конечные пределы? - person Carl Witthoft   schedule 04.12.2014g(delta)
в распределении Коши. - person J.R.   schedule 04.12.2014print(delta)
в свою функцию, чтобы увидеть, какие точки фактически оцениваются. - person baptiste   schedule 05.12.2014