Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

The following function is defined for Real input:

FFc = Compile[{{x, _Real}, {EF, _Real}},If[x > EF, 0., If[x == EF, 0.5, 1.]]]

FFc is now used in the function called foo:

EBoundary = 6.5;
foo[Ef_?NumericQ] := NIntegrate[FFc[x, Ef] , {x, -EBoundary, EBoundary}]

When I call foo like

foo[3.2]

I get an error message:

CompiledFunction::cfsa: "Argument x at position 1 should be a \!\(\"machine-size real number\"\)."

Since I'm using real numbers I have no idea why I get this message. What is the problem? Is it, because If[] can return 0?

share|improve this question

1 Answer 1

up vote 9 down vote accepted

It's because FFc is being passed x and Ef symbolically, at first. To cure the problem, add an intermediate function between FFc and NIntegrate, such as

f[x_?NumericQ, Ef_?NumericQ] := FFc[x,Ef]

then

foo[Ef_?NumericQ] := NIntegrate[f[x, Ef] , {x, -EBoundary, EBoundary}]
share|improve this answer
2  
Do you perhaps know why adding "RuntimeOptions" -> {"EvaluateSymbolically" -> False} to FFc does not cure the problem? –  Ajasja Jan 18 '13 at 9:40
1  
@Ajasja Seems related to why FFc[-x,0.] gives error while FFc[x,0.] doesn't. I wonder why NIntegrate passes -x as argument to the function. (This comment is assuming {"EvaluateSymbolically" -> False}) –  ssch Jan 18 '13 at 12:20
    
@Ajasja Seems if the integration region is {x,-a,a} it doesn't work, while it is unsymmetric like {x,-a-0.00001,a} it does –  ssch Jan 18 '13 at 12:26
    
@Ajasja no idea. Compile is not my strong suit. –  rcollyer Jan 18 '13 at 13:14
    
Thanks. Perhaps @OleksandR will see this:) –  Ajasja Jan 18 '13 at 13:47

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.