[Date Index] [Thread Index] [Author Index]
Making Mathematica Functions Evaluate Rapidly?
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 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.