2016-04-11 1 views
0

Я использую cuhre из R2Cuba 1.1-0 для интеграции следующие функцииИнтеграция с cuhre

fn <- function(x) { 
     pnorm((-2-sum(sqrt(vecRho)*x))/sqrt(1-sum(vecRho)))*prod(dnorm(x)) 
     } 

где vecRho вектор из 6 чисел от 0 до 0,1, т.е.

vecRho<-runif(6,0,0.1) 

По определению подынтегральное выражение fn находится между 0 и 1. Ожидается, что интеграция будет положительной. Однако, используя cuhre результат становится отрицательным, когда длина vecRho превышает 5.

NDIM<-length(vecRho) 
cuhre(NDIM, 1, fn, 
     flags = list(verbose =0), 
     lower = rep(-10,NDIM), 
     upper = rep(10,NDIM))$value 
[1] -0.4738284 

Кроме того, когда длина vecRho> = 6 абсолютного значения интеграции возрастает как длину vecRho увеличивается.

Есть ли что-то, что я могу сделать, чтобы исправить это? Благодаря!

+0

Неясно, что это значит 'прод (dnorm (х))'. Вам действительно нужен ПРОДУКТ всех гауссовых ядер? –

+0

Да, prod (dnorm (x)) - функция плотности. Так как все переменные независимы, то плотность нормального распределения n-dim-ванов является эффектом dnorm (x). – Lamothy

ответ

0

ОК, получилось, у вас есть 6D-интеграл с 6 гауссовскими ядрами внутри. Я знаю хороший ответ для интеграции 1D с гауссовским ядром. Он называется Gauss-Hermite quadrature, и для него есть пакет R. Если вы пройдете этот маршрут, вам нужно будет сделать функции карри, но это может стоить того.

Некоторые примеры кода:

library(gaussquad) 

n.quad <- 128 # integration order 

# get the particular (weights,abscissas) as data frame 
# with 2 observables and n.quad observations 
rule <- ghermite.h.quadrature.rules(n.quad, mu = 0.0)[[n.quad]] 

# test function - integrate 1 over exp(-x^2) from -Inf to Inf 
# should get sqrt(pi) as an answer 
f <- function(x) { 
    1.0 
} 

q <- ghermite.h.quadrature(f, rule) 
print(q - sqrt(pi)) 
+0

Спасибо, Северин. Я думаю, что использование функции currying function будет работать. Фактически, он работает, просто используя функцию «интегрировать» в r. Проблема - время выполнения. Это занимает много времени даже при D = 3. Интересно, как «gaussquad» выполняет, когда D> = 3. – Lamothy

+0

@ Loy Ну, каждая интеграция представляет собой взвешенную сумму в 128 (в случае выше) звонков на 'f'. Таким образом, 6D-интеграл будет 128^6 вызовов. Я предпочитаю G-H (или Gauss-Legendre в случае экспоненциального ядра), потому что он лучше заботится о значениях под гауссовским колоколом, чем что-либо еще. –

+0

Спасибо за ваши комментарии, Северин. Попробует. – Lamothy