Making Mathematica Functions Evaluate Rapidly?

*To*: mathgroup at smc.vnet.net*Subject*: [mg2206] Making Mathematica Functions Evaluate Rapidly?*From*: siegman at ee.stanford.edu (A. E. Siegman)*Date*: Mon, 16 Oct 1995 11:53:04 -0400*Organization*: Stanford University

I frequently want to evaluate (plot, numerically integrate, calculate numerical moments of) functions which start out complex, e.g., something like f[x,y,z] = (1/ f1[x,y,z] ) Exp[ f2[x,y,z] ] where f1[x,y,z] and f2[x,y,z] may contain various purely real coefficients, call 'em a,b,c,... which have fixed (predefined) values, as well as the variables x,y,z , and some explicit I's (the imaginary unit I), and some standard functions, e.g., Cos[], Sin[], etc.. In other words, all input values are purely real, and all I's are explicit. Then, what I really want to do is to generate purely real outputs, either g1[x,y,z] = Abs[f[x,y,z]] or g2[x,y,z] = Abs[f[x,y,z]]^2 in a form that will evaluate as rapidly as possible (on a PowerMac). What's the best way to do this? Should I define the initial functions using = or := ? At what stage should I compile (and how)? Can I compile a function that contains other functions that have already been compiled? I sometimes seem to get very small complex values coming out of the compiled versions of g1 or g2 (i.e., the Abs[] functions), even though I've used _Real on x,y,z in the compilation, which makes me think they may being evaluated with complex values even though everything is supposedly real. Do I need to use ComplexExpand somehow on f[x,y,z] to separate it into Re and Im parts, then square them independently to get Abs[]^2 ? And finally, what if Pi or Sqrt[2] or ... are also contained in the functions f1, f2 ? Do I need to do something to force those into numerical form also? (My experience is that depending on just how I set up a calculation like the above I get wildly different speeds -- but there seems to be no systematic way to know how to get the fastest evaluation.) Email replies to siegman at ee.stanford.edu appreciated -- thanks.