2014-09-19 5 views
0

Я работаю над проблемой, которая требует численного интегрирования двумерной функции, где каждая оценка функции занимает около 1 минуты. Поскольку численное интегрирование на одном ядре будет оценивать функцию от тысячи до десятков тысяч раз, я хотел бы распараллелить вычисления. Сейчас я использую метод bruteforce, который вычисляет наивную сетку точек и складывает их с соответствующими множителями областей. Это определенно неэффективно, и я подозреваю, что любой современный многомерный алгоритм цифровой интеграции сможет достичь такой же точности с гораздо меньшим количеством оценок функций. В R есть много пакетов, которые бы более эффективно и точно вычисляли интеграцию с использованием 2-d (например, R2Cuba), но я не нашел ничего, что можно легко распараллелить в кластере с управляемыми очередями заданий SGE. Поскольку это лишь небольшая часть более крупной проблемы исследования, я хотел бы посмотреть, можно ли это сделать с разумными усилиями, прежде чем я попытаюсь распараллелить один из методов, основанных на кубатурном правиле, в R.Параллельное многомерное числовое интегрирование в R?

+0

Почему бы не запустить цикл над срезами вашего внешнего подынтегрального выражения, назначив каждый фрагмент другому ядру? 'mcapply' приходит на ум. –

+0

Вопрос тогда станет тем, как я могу распараллелить внешнюю интеграцию, не зацикливая над срезами. Существует одна причина, что адаптивная квадратура и другие вещи используются для одномерного интегрирования. Я также хотел бы ограничить каждую работу в течение 6 часов, чтобы я мог поставить их в очередь как обычные задания на SGE. Вычисление внутреннего интеграла на одном ядре займет много времени. – user1600

+0

Вы не можете распараллелить ** любую ** функцию, если вы не можете разделить ее на части, которые полностью независимы друг от друга. То, что вы готовы или не хотите отказываться от этой независимости, зависит от вас. –

ответ

0

Я обнаружил, что с использованием sparse grid достигается лучший компромисс между скоростью и точностью в многомерной интеграции, и он легко разбивается на кластер, поскольку он не предусматривает каких-либо последовательных шагов. Он не будет таким точным, как другие последовательные алгоритмы интеграции, но он намного лучше, чем наивный метод, поскольку он обеспечивает гораздо более редкую сетку точек для расчета на каждом ядре.

Следующий R-код относится к двумерной интеграции, но может быть легко модифицирован для более высоких измерений. Функция приложения к концу может быть легко распараллелена на кластере.

sg.int<-function(g,...,lower,upper) 

{ require("SparseGrid") 

lower<-floor(lower) 

upper<-ceiling(upper) 

if (any(lower>upper)) stop("lower must be smaller than upper") 

gridss<-as.matrix(expand.grid(seq(lower[1],upper[1]-1,by=1),seq(lower[2],upper[2]-1,by=1))) 

sp.grid <- createIntegrationGrid('KPU', dimension=2, k=5) 

nodes<-gridss[1,]+sp.grid$nodes 

weights<-sp.grid$weights 

for (i in 2:nrow(gridss)) 

{ 
    nodes<-rbind(nodes,gridss[i,]+sp.grid$nodes) 

    weights<-c(weights,sp.grid$weights) 

    } 

    gx.sp <- apply(nodes, 1, g,...) 
    val.sp <- gx.sp %*%weights 
    val.sp 
} 
Смежные вопросы