Re: Slow iteration in a functional program
- To: mathgroup at smc.vnet.net
- Subject: [mg35656] Re: Slow iteration in a functional program
- From: "Mariusz Jankowski" <mjkcc at usm.maine.edu>
- Date: Wed, 24 Jul 2002 02:06:37 -0400 (EDT)
- Organization: University of Southern Maine
- References: <ahj0ea$gp9$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Matthew, if want to retain your original formulation then change the assignment for Phi[n] to Phi[n_] := Phi[n] = Phi[n-1] Exp[-(1-P[n-1])*xsec] this uses a dynamic programming construct (look under "dynamic programming" in HelpBrowser Master Index). You should also correct your error in the definition for G[n]. It should read G[n_]:=ListIntegrate[xsec Phi[n], h] where h is a step size. You should get even better performance if you use a vector-oriented approach. Define the initial vectors and scalars and change their values inside a Do loop construct. Bye, Mariusz -- ====================================================== Mariusz Jankowski University of Southern Maine mjkcc at usm.maine.edu "Matthew Rosen" <mrosen at cfa.harvard.edu> wrote in message news:ahj0ea$gp9$1 at smc.vnet.net... > 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 >