[Date Index]
[Thread Index]
[Author Index]
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
>
Prev by Date:
**Re: Re: Pattern Matching in Lists**
Next by Date:
**Re: elementwise vector scalar subtraction**
Previous by thread:
**RE: Slow iteration in a functional program**
Next by thread:
**RE: Re: Slow iteration in a functional program**
| |