我正在研究一个需要对二元函数进行数值积分的问题,其中每个函数的评估大约需要1分钟。由于单个核心上的数值积分会将函数评估为数千到数万次,因此我希望将计算并行化。现在我正在使用强力方法来计算一个天真的点网格,并用适当的面积乘数将它们相加。这绝对不是有效的,我怀疑任何现代多维数值积分算法都能够通过更少的函数评估来实现相同的精度。 R中有许多软件包可以更有效和准确地计算二维集成(例如R2Cuba),但我还没有找到任何可以在具有SGE管理作业队列的集群上轻松并行化的软件包。由于这只是一个更大的研究问题的一小部分,我想看看是否可以通过合理的努力完成,然后我尝试在R中自己并行化一个基于Cubature规则的方法。
答案 0 :(得分:1)
我发现使用sparse grid可以在多维集成中实现速度和准确度之间的最佳折衷,并且它很容易在群集上进行并行化,因为它不涉及任何顺序步骤。它不像其他顺序的adpative集成算法那样精确,但它比天真的方法要好得多,因为它提供了一个更稀疏的点网格来计算每个核心。
以下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
}