Subject: I noticed that integrate is sometimes faster
From: Richard Hennessy
Date: Sun, 21 Dec 2008 21:20:26 -0500
I have tried benchmarking pw.mac's integrate and pwdefint to see the timing for each command and sometimes pwdefint is actually
slower that just using integrate. So I have to correct myself and the help about the performance gain by using pwdefint instead of
integrate. In the Fourier series examples pwdefint is a lot faster but in my current test based upon my curvefit program below
integrate is better than twice as fast. Any ideas on why, I don't have any right now
(%i1) outchar:expr$
(%i16) curvefit(L,x,d):=
block(
[len,i,j,k,eq],
L:sort(L,lambda([x,y],x[1]<y[1])),
degree:d,
numpoints:length(L),
numsets:numpoints-(degree+1),
numintervals:numpoints-1,
for eqset : 1 thru numsets do
(
for j : 0 thru degree do
(
eq[j]:sum(A[k]*L[eqset+j][1]^k,k,1,degree)+A[0]-L[eqset+j][2]
),
ans[eqset]:solve(makelist(eq[j],j,0,degree),makelist(A[j],j,0,degree))[1],
for j: 0 thru degree do D[eqset,j]:rhs(ans[eqset][1+j])
),
intervaldelta:(L[1][1]+L[length(L)][1])/numintervals,
for i : 0 thru numintervals-1 do interval[i+1]:[L[1][1]+i*intervaldelta, L[1][1]+(i+1)*intervaldelta],
lf(i):=round(((numpoints-degree-2)/(numpoints-2))*i+degree/(numpoints-2)),
if pwexpand='unitstep then
sum((D[lf(i),0]+sum(D[lf(i),k]*x^k,k,1,degree))*(unit_step(x-interval[i][1])-unit_step(x-interval[i][2])), i, 1,
numintervals)
elseif pwexpand='signum then
sum((D[lf(i),0]+sum(D[lf(i),k]*x^k,k,1,degree))*((signum(x-interval[i][1])+1)/2-(signum(x-interval[i][2])+1)/2), i, 1,
numintervals)
else
0
)$
(%i17) ratprint:false;
(expr17) false
(%i18) wxplot_size:[600,300];
(expr18) [600,300]
(%i19) PS:''(n:50,makelist([i/n*6,cos(1/n*2*i*%pi)*cos(1/n*8*i*%pi)],i,0,n))$
(%i20) f(x):=''(curvefit(PS,x,5))$
(%i25) showtime:true$float(integrate(f(x),x,-10,10));showtime:false$
Evaluation took 0.0000 seconds (0.0000 elapsed)
Evaluation took 22.9200 seconds (22.9200 elapsed)
(expr26) -0.0033644075483838
(%i29) showtime:true$float(pwdefint(f(x),x,-10,10));showtime:false$
Evaluation took 0.0000 seconds (0.0000 elapsed)
Evaluation took 58.7500 seconds (58.7500 elapsed)
(expr30) -0.0033644075483837