Re: RE: NIntegrate - problems with HoldAll property(?) - the
- To: mathgroup at smc.vnet.net
- Subject: [mg73217] Re: RE: NIntegrate - problems with HoldAll property(?) - the
- From: gotcha <david.shorthouse at credit-suisse.com>
- Date: Thu, 8 Feb 2007 03:31:58 -0500 (EST)
Hi I have the solution to my problems. For reference I give them below Problem: ======== I want to NIntegrate the equivalent of the functions: f1[x_] := Module[{res,y}, res = First[Position[{1, 3, 5, 7, 9, Infinity}, y_ /; y>= x, Infinity, 1]]; res[[1]] ] NIntegrate[f1[i], {i, 0,7}] and f2[x_] := Module[{res,y}, res = First[Position[{1, 3, 5, 7, 9, Infinity}, y_ /; y>= x, Infinity, 1]]; { res[[1]],{a,b,c,d} } ] NIntegrate[f2[i][[1]], {i, 0,7}] Both of the NIntegrates fail because the "i" variable does not get resolved to a number at the time of the calls to f1 and f2 Solution to f1 ============== Quite a few people gave me the answer for f1[]. If I define the function so it only takes a numeric input, the NIntegrate function resolves the "i" variable to a number before the call. I'm not sure why this works but I am glad it does. So this works: f1[(x_)?NumericQ] := Module[{res,y}, res = First[Position[{1, 3, 5, 7, 9, Infinity}, y_ /; y>= x, Infinity, 1]]; res[[1]] ] NIntegrate[f1[i], {i, 0,7}] But this doesn't:(!!) f2[(x_)?NumericQ] := Module[{res,y}, res = First[Position[{1, 3, 5, 7, 9, Infinity}, y_ /; y>= x, Infinity, 1]]; { res[[1]],{a,b,c,d} } ] NIntegrate[f2[i][[1]], {i, 0,7}] It gives a numeric result but the wrong one! Because the "i" variable is not resolved to a number this time, my definition of f2 does not even get called, so we are essentially doing: NIntegrate[i, {i, 0,7}] Solution to f2 ============== After a bit of fiddling I finally got f2 to work, as follows: f2[(x_)?NumericQ] := Module[{res,y}, res = First[Position[{1, 3, 5, 7, 9, Infinity}, y_ /; y>= x, Infinity, 1]]; { res[[1]],{a,b,c,d} } ] f3[(x_)?NumericQ] := f2[x][[1]] NIntegrate[f3[i], {i, 0,7}] Having a "pure" function in the integral seems to allow the NIntegrate to resolve the "i" variable to a number before the call to f3, so all is well again I'm still a little confused but I am able to continue. Thanks for all the help David