InterpolatingFunction's and NIntegrate

*To*: mathgroup at yoda.physics.unc.edu*Subject*: InterpolatingFunction's and NIntegrate*From*: TDR at vaxc.cc.monash.edu.au*Date*: 01 Jul 1993 19:38:05 +1100

Dear Mathgroup, > > After all D[] knows how to handle InterpolatingFunction's, so why > > not NIntegrate[] and Integrate[] too? >But ND[ ] does not do anything special with InterpolatingFunction[ ]s. The >point is well taken that Integrate[ ] should be able to undo anything that >D[ ] does, but I disagree that NIntegrate[ ] should do symbolic computation: >everytime we make NIntegrate[ ] "smarter" the overhead gets a little slower >and users wonder why something as trivial as NIntegrate[x^2, {x, 2, 5}] >takes so long. The "N" in NIntegrate means that the algorithm is numerical. One can make NIntegrate[ ] "smarter" *without* slowing it down: Unprotect[NIntegrate]; NIntegrate[f_InterpolatingFunction,region__List, opts___] := integrateInterpolatingFunction[f,region,opts]; Protect[NIntegrate]; This doesn't slow down a computation like NIntegrate[x, {x, 2, 5}] any noticeable amount, as far as my timings show: Do[ NIntegrate[x, {x, 2, 5}], {100} ]//Timing takes just as long before and after the above definition. [Note there is a bug in Mma2.1 which causes NIntegrate[x^2, {x, 2, 5}] with x *squared* to take progressively longer each time it is called. So I didn't use that for my timings above. The bug is not present in Mma2.2] The only trick now would be to write the integrateInterpolatingFunction[] code mentioned above. For 1-D regions that cover the whole interval of the InterpolatingFunction then integrateInterpolatingFunction[_[{xmin_,xmax_},table_],{_,xmin_,xmax_}] := Plus @@ Map[(#[[1]]-#[[2]])*#[[3,1]]&, table] is *roughly* the integral (I don't know the internal details of exactly what an InterpolatingFunction table contains, so I can't write a better routine). Sub-intervals and higher order approximations would be harder, but not impossible. Multi-dimensional problems would be a lot trickier though. Terry Robb