Re: A faster alternative to ListIntegrate?
- To: mathgroup at smc.vnet.net
- Subject: [mg36497] Re: A faster alternative to ListIntegrate?
- From: Selwyn Hollis <slhollis at earthlink.net>
- Date: Mon, 9 Sep 2002 00:29:43 -0400 (EDT)
- References: <3D7B95CC.2000504@earthlink.net>
- Sender: owner-wri-mathgroup at wolfram.com
For what it's worth, here's a version of Simpson's rule that works with both equally spaced and unequally spaced points. simp = Compile[{x1,y1,x2,y2,x3,y3}, With[{h13=x1-x3, h12=x1-x2, h23=x2-x3}, (-y1*h23*(2x1-3x2+x3) - y2*h13^2 + y3*h12*(x1-3x2+2x3))*h13/(6h12*h23)]]; ListSimpson[vals_?VectorQ, dx_Real]:= With[{n=Length[vals]}, If[OddQ[n], (dx/3)*(First[vals] + Last[vals] + 4*Plus@@vals[[Range[2,n-1,2]]] + 2*Plus@@vals[[Range[3,n-2,2]]]), $Failed]]; ListSimpson[datapts_?MatrixQ] := If[OddQ[Length[datapts]], Plus@@(simp@@Flatten[#]&/@ Partition[datapts,3,2]), $Failed] (* equally spaced points*) data = Table[100*Sin[x], {x, 0, 100, 0.001}]; ListSimpson[data, .001] // Timing {0.21 Second, 13.7681} (* randomly spaced points *) Table[ {data = Sort[Table[With[{x = Random[Real,{0,100}]},{x,100*Sin[x]}],{100001}]]; ListSimpson[data] // Timing, With[{xvals = Transpose[data][[1]]}, gaps = Drop[RotateLeft[xvals] - xvals, -1]; {Min[gaps], Max[gaps]}]}, {4}] {{{1.62 Second, 13.8348}, {1.32223*10^-8, 0.0114454}}, {{1.59 Second, 13.8261}, {2.42163*10^-8, 0.0127803}}, {{1.62 Second, 13.8455}, {1.08923*10^-9, 0.0119059}}, {{1.54 Second, 13.7987}, {9.66814*10^-9, 0.0106988}}} --- Selwyn Hollis > Mathew, > > Some possibilities > > <<NumericalMath`ListIntegrate` > > ListIntegrate[data]//Timing > > {6.59 Second,13.7681} > > The following is suggested in the Help Browser entry for the package > Integrate[ > Interpolation[data, InterpolationOrder\[Rule]1][x], > {x,0,100}]//Timing > > {4.56 Second,13.768} > > Trapezium rule with equal steps: > > #[[1]]+#[[-1]]+ 2 Tr[Take[#,{2,-2}]]&[data[[All,2]]] 0.01/2//Timing > > {0.22 Second,13.768} > > Trapezium rule with possibly unequal steps > > (Drop[#1,1] - Drop[#1,-1]).(Drop[#2,-1] + Drop[#2,1])&[ > data[[All,1]], data[[All,2]]]/2//Timing > > {0.83 Second,13.768} > > -- > Allan > > --------------------- > Allan Hayes > Mathematica Training and Consulting > Leicester UK > www.haystack.demon.co.uk > hay at haystack.demon.co.uk > Voice: +44 (0)116 271 4198 > Fax: +44 (0)870 164 0565 > > > "Matthew Rosen" <mrosen at cfa.harvard.edu> wrote in message > news:ahr122$l2v$1 at smc.vnet.net... > > Hi Everyone; > > I've tracked down the slow operation of my Mathematica simulation > code to > > lie in the ListIntegrate command: > > > > G[n_] := ListIntegrate[xsec Phi[n], 1] > > > > where both xsec and Phi[n] are 400 values long. > > > > Is there a way to speed up ListIntegrate via Compile or a similar > technique? > > > > Thanks in advance and best regards, > > > > Matt > > --- > > Matthew Rosen > > Harvard-Smithsonian Center for Astrophysics > > Mail Stop 59 > > 60 Garden Street > > Cambridge, MA 02138 > > > > e: mrosen at cfa.harvard.edu > > o: (617) 496-7614 > > > >