NIntegrate (multi-dimensional integral)

I am interested in the numerical evaluation of the following integral:

$\int \prod_{i=1}^n dx_i \delta(\sum_{i=1}^n x_i) \prod_{i=1}^n f_i(x_i)$

where $f(x)$ is a complicated function. Unfortunately NIntegrate seems to give an answer with too large errors; this seems to be problem of the multi-dimensional integral. The function contains the phase fluctuations ($\sim e^{ikx}$), which could be one of the reasons. In practice $n\sim 5$, although it is certainly better if I could take $n$ large.

For comparison, I can also consider an integral

$\int \prod_{i=1}^n dx_i \prod_{i=1}^n f_i(x_i)$

but instead of evaluation this whole expression in NIntegrate, I could factorize the integral to be

$\prod_{i=1}^n \left(\int dx_i\, f_i(x_i)\right)$, evaluate the 1-dimensional integral first and then take a product. This seems to give an answer which is numerically much better than NIntegrating the n-dimensional integral. [I am numerically checking the known mathematical identity so I have something to compare with. The one with the delta function corresponds to $SU(N)$, the one without to $U(N)$.]

The trouble with the one above, with 1 delta function, is that the integral does not factorize. However I hope there is a way to achieve numerical accuracy, rather than brute-force NIntegrate of the whole expression.

In any case I would appreciate any suggestions for better numerical accuracy.

• It would be much easier to help you if you included some (minimal) working example. – Yves Klett Jun 21 '14 at 18:16
• You are integrating over the hyperplane defined by delta. There is no way you will get good results with NIntegrate because the results depend on the (essentially zero) probability of the grid scheme exactly hitting the hyperplane. (and if it does you'll get an error that delta is not numerical) I think you need to roll your own quadrature scheme which will require gridding out the hyperplane. Not a trivial task even for n=3. – george2079 Jun 22 '14 at 12:02
• pondering this some more, a good approach may be a monte carlo integration, where you generate random sets x_i s.t Sum[x_i]==0 and all x_i within integration region. I'm Pretty sure there was a question on that topic recently. – george2079 Jun 22 '14 at 14:29