MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Bug in NIntegrate[]?


> I define the function f[x] as follows:
> f[x_] := 0 /; x < 0 || x > 1;
> f[x_] := 1
> It is zero outside of the interval [0,1]. This can be verified by plotting
> Plot[f[x], {x, -1, 2}]
> Now I integrate it from -1 to 2:
> In[270]:= NIntegrate[f[x], {x, -1, 2}]
> Out[270]= 3.
> The result should be 1, but it is 3. Clearly Mathematica ignores the fact that f[x] is zero outside of [0,1].
> This caused a lot of headache for me recently when I encountered such behavior in one of my research code.
> GS

Another variant of the most frequently asked question :-). NIntegrate does evaluate the integrand symbolically, if not told otherwise. That symbolic evaluation will return 1 in your case:

Out:= 1

Since NIntegrate doesn't seem to accept the option Evaluated->False as some other functions which have the same problem do, you need to define the function so it only evaluates for numeric arguments:

f[x_?NumericQ] := 0 /; x < 0 || x > 1;
f[x_?NumericQ] := 1

That will make NIntegrate behave as expected (it will complain about bad convergence, but that I'd consider expected behaviour for that function :-). Note that it can do better if you use more "mathematical" ways to define your function, e.g. UnitStep, UnitBox or HeavsideTheta.



  • Prev by Date: Re: Bug in NIntegrate[]?
  • Next by Date: Re: Bug in NIntegrate[]?
  • Previous by thread: Re: Bug in NIntegrate[]?
  • Next by thread: Re: Bug in NIntegrate[]?