Re: Partial evaulation of function terms
- To: mathgroup at smc.vnet.net
- Subject: [mg53260] Re: [mg53230] Partial evaulation of function terms
- From: DrBob <drbob at bigfoot.com>
- Date: Mon, 3 Jan 2005 04:29:36 -0500 (EST)
- References: <200501020912.EAA27721@smc.vnet.net>
- Reply-to: drbob at bigfoot.com
- Sender: owner-wri-mathgroup at wolfram.com
> Is there a way to force Mathematica to evaluate all > subterms which already can be evaluated? If amp, freq, and t are all varying from call to call, there are no such subterms (so far as I can see). You can probably do slightly better, though, with this: Clear@parFun parFun[amps_, freq_][t_] := amps.Sin[(2Pi*freq*t) Range@Length@amps] parFun[{1/3, 1/2}, 220][t] (1/3)*Sin[440*Pi*t] + (1/2)*Sin[880*Pi*t] It is possible to optimize somewhat if you decide (for instance) that Length@amp changes much less often than amp, freq, or t, then this may help: Clear[parFun, parFun1] parFun1[n_Integer] := parFun1[n] = Evaluate@Sin[(2Pi*#) Range@n] & parFun[amps_, freq_][t_] := amps.parFun1[Length@amps][freq*t] parFun1[2] parFun[{1/3, 1/2}, 220][t] (outputs) {Sin[2*Pi*#1], Sin[4*Pi*#1]} & (1/3)*Sin[440*Pi*t] + (1/2)*Sin[880*Pi*t] If the values of amp won't change too often, you can go a step farther: Clear[parFun, parFun1] parFun1[n_Integer] := parFun1[n] = Evaluate@Sin[(2Pi*#) Range@n] & parFun[amps_] := parFun[amps] = Evaluate[amps.parFun1[Length@amps][#]] & parFun[amps_, freq_][t_] := parFun[amps][freq*t] parFun1[2] parFun[{1/3, 1/2}] parFun[{1/3, 1/2}][220t] parFun[{1/3, 1/2}, 220][t] (outputs) {Sin[2*Pi*#1], Sin[4*Pi*#1]} & (1/3)*Sin[2*Pi*#1] + (1/2)*Sin[4*Pi*#1] & (1/3)*Sin[440*Pi*t] + (1/2)*Sin[880*Pi*t] (1/3)*Sin[440*Pi*t] + (1/2)*Sin[880*Pi*t] That allows alternate calling sequences and requires storage for each value of "amps". I doubt this will save a great deal of time over your original code, however. Bobby On Sun, 2 Jan 2005 04:12:39 -0500 (EST), Erich Neuwirth <erich.neuwirth at univie.ac.at> wrote: > I have the following function definition > > ParFun[amps_, freq_] := Function[t, Sum[amps[[i]]*Sin[2*Pi*freq*i*t], { > i, Length[amps]}]] > > Then, the following works: > > ParFun[{1,1/2},220][t]//InputForm > Sin[440*Pi*t] + Sin[880*Pi*t]/2 > > but > ParFun[{1,1/2},220]//InputForm > yields > Function[t$, Sum[{1, 1/2}[[i]]*Sin[2*Pi*220*i*t$], {i, Length[{1, 1/2}]}]] > > Is there a way to force Mathematica to evaluate all > subterms which already can be evaluated? > This function will be called in Play very often, so it would make things > much faster if you could assign the function with all possible > constants evaluated to a local variable and do the many calls to the > function for producing numerical values with the "partially > preevaluated" expression. > > > > -- DrBob at bigfoot.com www.eclecticdreams.net
- References:
- Partial evaulation of function terms
- From: Erich Neuwirth <erich.neuwirth@univie.ac.at>
- Partial evaulation of function terms