RE: Slow iteration in a functional program
- To: mathgroup at smc.vnet.net
- Subject: [mg35649] RE: [mg35630] Slow iteration in a functional program
- From: "DrBob" <majort at cox-internet.com>
- Date: Wed, 24 Jul 2002 02:06:20 -0400 (EDT)
- Reply-to: <drbob at bigfoot.com>
- Sender: owner-wri-mathgroup at wolfram.com
For instance, ClearAll[G] G[n_] := G[n] = xsec ListIntegrate[Phi[n]] causes the G values to be saved as they're calculated. (Taking xsec outside ListIntegrate should be equivalent, right?) Calculating G[1000] right away will cause iteration limits to be exceeded, so you need to calculate from the bottom up: G /@ Range[1000]; Use the same trick to save values of Phi and P, of course. Then the bottom-up calculation of G will cause all the other calculations to be stored. I am sure the C code was somehow storing values, too. Bobby -----Original Message----- From: Matthew Rosen [mailto:mrosen at cfa.harvard.edu] To: mathgroup at smc.vnet.net Subject: [mg35649] [mg35630] Slow iteration in a functional program Everyone, I've been trying to recast an iterative calculation I do as a procedural program in C as an elegant functional program in Mathematica 4.1. The Mathematica code is much more transparent, but the resultant execution time is more than two orders of magnitude longer. Any suggestions would be greatly appreciated.The following is a schematic of the problem. There are three equations in the iteration variable, n: G[n_] := ListIntegrate[xsec Phi[n]] Both xsec and Phi[n] are 400 points long. P[n_] := G[n]/(G[n]+(a constant)+D[n]) D[n] is a simple algebraic function of n. Phi[1] = Flux; Flux is 400 points long. Phi{n_] := Phi[n-1] Exp[-(1-P[n-1])*xsec The goal is to evaluate P[n_] for an n around 1000. After running, I need to know all the values of P[n] and Phi[n] at each n from 1 to nmax. Note, P[n] is a number and Phi[n] is 400 points long. Currently, Timing[P[1]] = 0.1 s Timing[P[2]] = 0.2 s Timing[P[5]] = 8.4 s. I dont dare try to evaluate P[1000] as I need to do. Every time I evaluate these functions they recalculate from scratch. I think I need to somehow tell Mathematica to save the intermediate values. Curious is that the calculation time is going up like n^2, not like n as I would have thought. The equivalent procedural c-code runs in less than 1 second to evaluate P[1000]. Thanks in advance for any guidance! -Matt Rosen -- 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