# NIntegrate fails with functions that have (necessarily) numeric lists as arguments

I'm not able to NIntegrate a function that has a numeric list as an argument. My original problem involves a compiled function, but a MWE is the following:

g[r : {__?NumericQ}, x_?NumericQ] := r;
NIntegrate[g[{2}, x], {x, 0, 10}]


This gives me the following error:

which I fail to understand, since

g[{2}, 0.0795732]


evaluates perfectly fine to {2}.

Other functions like Plot are fine, i.e. the following works as expected:

Plot[g[{2}, x], {x, 0, 10}]


Also, if we don't force the arguments to be numeric, i.e.:

gS[r_, x_] := r;
NIntegrate[gS[{2}, x], {x, 0, 10}]


everything works fine. But I do need to force them to be numeric because eventually I want to NIntegrate a compiled function. The example posted here is the simplest MWE I've been able to provide.

I would really appreciate any thoughts, since I'm quite lost here. Thank you so much, Luis

• {2} is not a number – Carl Woll Dec 20 '18 at 19:34
• @CarlWoll. I don't think that's the problem, because NIntegrate[{2}, {x, 0, 1}] evaluates just fine. The issue is that in NIntegrate[gS[{2}, x], {x, 0, 10}], the integrand won't evaluate to a number because x is not a number. On the face of it, I wouldn't know how to short-circuit the evaluation here, because Evaluate@gS[{2}, x] of course yields gS[{2}, x], but it needs to be evaluated before the NIntegrate so that {2} can integrate to {2.}. Luis, I suspect the thing that you are trying to do should be done in a different way. Perhaps the greater context would be helpful. – march Dec 20 '18 at 19:46
• @march, thank you so much for pointing that out. What I am trying to do is to NIntegrate each of the components of a compiled function that returns a list. Thanks to CarlWoll and you, I understand the problem much better now. – Luis Dec 21 '18 at 10:52

NIntegrate requires the integrand to be numeric, and the list {2} is not numeric:

NumericQ[{2}]


False

You need your function g to return something that is numeric, not a list.

(aside: @march points out that:)

NIntegrate[{2}, {x, 0, 1}]


{2.}

works fine, but that is because NIntegrate recognizes that the first argument is a list and so it threads the first argument. One can see this happening using TracePrint:

Trace @ NIntegrate[{2}, {x, 0, 1}]


{NIntegrate[{2},{x,0,1}],{NIntegrate[2,{x,0,1}]},{NIntegrate[2,{x,0,1}],{{x}=.,{x=.},{x=.,Null},{Null}},{x=.,Null},2.},{2.}}

Notice how NIntegrate[{2}, {x, 0, 1}] evaluates to {NIntegrate[2, {x, 0, 1}]}.

Your other approach worked because NIntegrate evaluated its first argument to a list, and then the default threading that happens when the first argument is a list took over.

So, you need to make sure the output of g is a number. For instance:

g[r:{__?NumericQ}, x_?NumericQ] := First @ r
NIntegrate[g[{2}, x], {x, 0, 10}]


20.

• Thank you so much Carl and March, now I understand everything. Perfectly clear explanation, thanks a lot Guys!!! – Luis Dec 21 '18 at 10:36