Re: Integration of a list

*To*: mathgroup at yoda.physics.unc.edu*Subject*: Re: Integration of a list*From*: bappadit at ecn.purdue.edu (Banerjee Bappaditya)*Date*: Fri, 22 Jan 93 14:51:54 EST

Hi mathgroup! I had asked some help of you in integrating a very long list. I got very helpful hints from Alfred M Kaufman and Dave Withoff. ___________________________________________________ The problem was : > > I have been trying to Integrate a moderate sized list from -Pi to Pi > and it is taking forever.....the individual components of the expression > are quite simple, so I cannot figure out what is taking so long... > > test = > {0, ((-0.25*I*E^(-3.*I*Omgn*Pi)*x1*y1)/(Omgn^3*Pi) + > (0.75*I*E^(-1.*I*Omgn*Pi)*x1*y1)/(Omgn^3*Pi) + > (-0.75*I*E^(1.*I*Omgn*Pi)*x1*y1)/(Omgn^3*Pi) + > (0.25*I*E^(3.*I*Omgn*Pi)*x1*y1)/(Omgn^3*Pi) - > (3*E^(-I*Omgn*t)*(I + -I*E^(2*I*Omgn*t))* > ((E^(-I*Omgn*t)*(1 + E^(2*I*Omgn*t))*x1)/2 + > (E^(-I*Omgn*t)*(I + -I*E^(2*I*Omgn*t))*y1)/(2*Omgn))^2)/(2*Omgn))* > ((0.04166666666666666*I*E^(-3.*I*Omgn*Pi)*t*x1^3)/(Omgn*Pi) + > (0.375*I*E^(-1.*I*Omgn*Pi)*t*x1^3)/(Omgn*Pi) + > (-0.375*I*E^(1.*I*Omgn*Pi)*t*x1^3)/(Omgn*Pi) + > (-0.04166666666666666*I*E^(3.*I*Omgn*Pi)*t*x1^3)/(Omgn*Pi) + > (-0.125*I*E^(-3.*I*Omgn*Pi)*t*x1*y1^2)/(Omgn^3*Pi) + > (0.375*I*E^(-1.*I*Omgn*Pi)*t*x1*y1^2)/(Omgn^3*Pi) + > (-0.375*I*E^(1.*I*Omgn*Pi)*t*x1*y1^2)/(Omgn^3*Pi) + > (0.125*I*E^(3.*I*Omgn*Pi)*t*x1*y1^2)/(Omgn^3*Pi) - > E^(I*Omgn*t)*(((-3*I)/8*x1^3)/Omgn - (3*x1^2*y1)/(8*Omgn^2) + > ((-3*I)/8*x1*y1^2)/Omgn^3 - (3*y1^3)/(8*Omgn^4)) + > (E^(-3*I*Omgn*t)*((-I/8*x1^3)/Omgn + (3*x1^2*y1)/(8*Omgn^2) + > ((3*I)/8*x1*y1^2)/Omgn^3 - y1^3/(8*Omgn^4)))/3 - > (E^(3*I*Omgn*t)*((-I/8*x1^3)/Omgn - (3*x1^2*y1)/(8*Omgn^2) + > ((3*I)/8*x1*y1^2)/Omgn^3 + y1^3/(8*Omgn^4)))/3 + > E^(-I*Omgn*t)*(((-3*I)/8*x1^3)/Omgn + (3*x1^2*y1)/(8*Omgn^2) + > ((-3*I)/8*x1*y1^2)/Omgn^3 + (3*y1^3)/(8*Omgn^4)) + > (0.5*F*t*Sin[-1.*Omg*Pi])/(Omg*Pi) - (0.5*F*t*Sin[1.*Omg*Pi])/(Omg*Pi) + > (F*Sin[Omg*t])/Omg)} > > Tperiod = 2*Pi > > Mean[func_List,t_]:= > (1.0/Tperiod)*Integrate[func,{t,-Tperiod/2.0,Tperiod/2.0}] > > Mean[test,t] is taking forever. > > ______________________________________________________________> > Daves Response : This expression expands out to an integrand with 225 terms. Expanding is a fairly reasonable way of approaching the problem, except that if Integrate has to tackle all of the terms at once it first sets up to try the terms in all possible combinations, since it has no way of knowing that the terms are individually integrable. Even though the very first combination will succeed, just setting up to do them all could take a very long time. In cases like this, my first suggestion is to use something like result = Map[Integrate[#, {t, -Pi, Pi}] &, ExpandedIntegrand] Unfortunately, in this example some of the terms also take a very long time by themselves. I noticed, for example, the following, which seems to be a bug. It shouldn't take this long: In[10]:= Integrate[b t Exp[I x t] Sin[a Pi]/(x Pi), t] //Timing I t x b Sin[a Pi] I b t Sin[a Pi] Out[10]= {5.95 Second, E (----------- - ---------------)} 3 2 Pi x Pi x Since this is such a simple problem mathematically, I just went ahead and made up my own integration function: In[59]:= int[a_, t_] := 2 Pi a /; FreeQ[a, t] In[60]:= int[a_ f_, t_] := a int[f, t] /; FreeQ[a, t] In[61]:= Integrate[t Exp[a + b t], {t, -Pi, Pi}] //InputForm (* compute this for copying into the subsequent rule *) Out[61]//InputForm= -((-(E^a/b^2) - (E^a*Pi)/b)/E^(b*Pi)) + E^(b*Pi)*(-(E^a/b^2) + (E^a*Pi)/b) In[62]:= int[t_ Exp[a_. + b_. t_], t_] := -((-(E^a/b^2) - (E^a*Pi)/b)/E^(b*Pi)) + E^(b*Pi)*(-(E^a/b^2) + (E^a*Pi)/b) /; FreeQ[{a, b}, t] I then applied this to the expanded second element of test: In[67]:= testExpanded = Expand[test[[2]]] ; In[68]:= Length[testExpanded] Out[68]= 225 In[69]:= testExpanded[[99]] -17 3. I Omgn Pi + I Omgn t 3 2 -1.38778 10 E t x1 y1 Out[69]= ------------------------------------------------- 4 Omgn Pi In[70]:= int[%, t] 3. I Omgn Pi 3. I Omgn Pi -17 I Omgn Pi E I E Pi Out[70]= (-1.38778 10 (E (------------- - ------------------) - 2 Omgn Omgn 3. I Omgn Pi 3. I Omgn Pi -I Omgn Pi E I E Pi 3 2 > E (------------- + ------------------)) x1 y1 ) / 2 Omgn Omgn 4 > (Omgn Pi) After adding one more rule, I get a result in a few seconds. In[71]:= int[f_ + g_, t_] := int[f, t] + int[g, t] In[72]:= result = int[testExpanded, t]; //Timing Out[72]= {17.4833 Second, Null} Unless I've made an algebra error (which is likely) this answer is probably correct. You can get a result even faster using Map: In[73]:= Map[int[#, t] &, testExpanded]; //Timing Out[73]= {4.41667 Second, Null} Dave Withoff withoff at wri.com _____________________________________________________ Al's response: Bappaditya Banerjee writes that a test function: test = {0,f1[t],f2[t],...,fn[t]} was taking a long time to integrate. His integration was written in the form: Mean[func_List,t_] := 1/(2.*Pi)*Integrate[func,{t,-Pi,Pi}]; First of all the integration is not a function of t any longer since the t in the integration is a dummy variable. I succeeded in doing the integration very quickly by defining the pure function: f = Function[{t},test]; and the integration: Mean[f_Function] := 1/(2*Pi)*Integrate[f[x],{x,-Pi,Pi}]; Then Mean[f] gives the answer which is too long to include here. Al Kaufman <kaufman1 at llnl.gav> I thank them for their time and interest. regards, bappa. Bappaditya Banerjee bappadit at mn.ecn.purdue.edu Ray W. Herrick Laboratories Purdue University West Lafayette, IN 47907 work : (317) 494 2132 (317) 494 2147 fax : (317) 494 0787 home : (317) 743 3982 > >