# WORKSHEET # 27 # # TABULATING FUNCTIONS NUMERICALLY # # -------------------------------------------------------------------------------- > restart; -------------------------------------------------------------------------------- # In this worksheet we will estimate the Sine integral, Si(x)=Int(sin(t)/t,t=0..x), for a # sequence of values of x. This is a convenient test case for the general procedure of # building tables for functions since Maple already knows the values of the Sine integral. In # other words we can tabulate the values of Si(x) using some numerical procedure and then # compare with the known values. But first we use the help command to get some # information on the Sine integral. I have edited the help page and only copied what is # relevant. -------------------------------------------------------------------------------- > ?Si -------------------------------------------------------------------------------- # # FUNCTION: Si - The Sine Integral # # CALLING SEQUENCE: # Si(x) # # PARAMETERS: # x - an expression # # SYNOPSIS: # - This integral is defined as follows: # # Si(x) = int(sin(t)/t, t=0..x) # # EXAMPLES: # # > Si(3.14159+7.6*I); # 63.60695388 - 123.1816272 I # # # > Si(12345.67890); # 1.570738760 # # -------------------------------------------------------------------------------- > Si(x)=Int(sin(t)/t,t=0..x); x / | sin(t) Si(x) = | ------ dt | t / 0 -------------------------------------------------------------------------------- # Now suppose we want to tabulate the values of Si(x) for x=0.0, 0.1, 0.2,...,10.0, that is the # values of Si(x[n]), where x[n]=n*(0.1), n=0..100. Each of the integrals # Int(f(t),t=x[n]..x[n+1]) will be estimated by Simpson's rule S[2] and then added up to give # an estimate of Int(f(t),t=0..x) for x=0.0, 0.1, 0.2,...,10.0. Thus the step size h=0.05. -------------------------------------------------------------------------------- > h:=n->(b-a)/n; b - a h := n -> ----- n -------------------------------------------------------------------------------- > X:=(i,n)->a+i*(b-a)/n; i (b - a) X := (i,n) -> a + --------- n -------------------------------------------------------------------------------- > Simpson:=n->(h(n)/3)*sum(f(X(2*i,n))+4*f(X(2*i+1,n))+f(X(2*i+2,n)),i=0..n/2-1); Simpson := /1/2 n - 1 \ | ----- | | \ | n -> 1/3 h(n) | ) (f(X(2 i, n)) + 4 f(X(2 i + 1, n)) + f(X(2 i + 2, n)))| | / | | ----- | \ i = 0 / -------------------------------------------------------------------------------- # Let S[n] denote Simpson's rule with n subdivisions. Assume that the integrand f(t) is 4 # times continuously differentiable. Then the error in Simpson's rule is given by a constant # times a fourth order derivative. -------------------------------------------------------------------------------- > Int(f(t),t=a..b)=S[n]-(D@@4)(f)(u)*(b-a)^5/(180*n^4); b / (4) 5 | D (f)(u) (b - a) | f(t) dt = S[n] - 1/180 ------------------- | 4 / n a -------------------------------------------------------------------------------- # Here u is some unknown point between a and b. -------------------------------------------------------------------------------- > f:=t->sin(t)/t; sin(t) f := t -> ------ t -------------------------------------------------------------------------------- > Diff(f(u),u$4)=(D@@4)(f)(u); sin(u) sin(u) cos(u) sin(u) cos(u) sin(u) Diff(------, u, u, u, u) = ------ + 4 ------ - 12 ------ - 24 ------ + 24 ------ u u 2 3 4 5 u u u u -------------------------------------------------------------------------------- # We do not know the value of u so, if we are to use this in the error formula then we must # estimate the maximum absolute value on the interval u=0..x. This can be quite tricky. # Fortunately there is another way. -------------------------------------------------------------------------------- > int(cos(t*x),x=0..1)=Int(cos(t*x),x=0..1); 1 / sin(t) | ------ = | cos(t x) dx t | / 0 # -------------------------------------------------------------------------------- # In fact let's redefine our function f(t) by this formula. This has the advantage that Maple # will now easily compute the value of f(t) at t=0. Another great advantage is that we can # easily compute derivatives of f(t) because we can differentiate with respect to x inside the # integral sign. -------------------------------------------------------------------------------- > f:=t->Int(cos(t*x),x=0..1); 1 / | f := t -> | cos(t x) dx | / 0 -------------------------------------------------------------------------------- > f(0); 1 / | | 1 dx | / 0 -------------------------------------------------------------------------------- > f(t); 1 / | | cos(t x) dx | / 0 -------------------------------------------------------------------------------- > Diff(f(t),t$4)=Int(diff(cos(t*x),t$4),x=0..1); 1 1 / / | | 4 Diff( | cos(t x) dx, t, t, t, t) = | cos(t x) x dx | | / / 0 0 -------------------------------------------------------------------------------- # From this we easily get an estimate for the fourth derivative. -------------------------------------------------------------------------------- > abs((D@@4)(f)(u))<int(t^4,t=0..1); 1 / | 4 abs( | cos(u x) x dx) < 1/5 | / 0 -------------------------------------------------------------------------------- # Applying this to the Sine integral for positive x we have -------------------------------------------------------------------------------- > abs(Si(x)-S[n])<(x^(5)/900)/n^4; 5 x abs(Si(x) - S[n]) < 1/900 ---- 4 n -------------------------------------------------------------------------------- > for n from 0 to 100 do x[n]:=n*(0.1) od:n:='n': -------------------------------------------------------------------------------- > abs(Int(sin(t)/t,t=x[n]..x[n+1])-S(2))<(0.1)^(5)/(900*16); x[n + 1] / | sin(t) -9 abs( | ------ dt - S(2)) < .6944444444*10 | t / x[n] -------------------------------------------------------------------------------- > starttime:=time(): -------------------------------------------------------------------------------- > for n from 0 to 99 do a:=x[n]: b:=x[n+1]: J[n]:=Simpson(2) od:n:='n': -------------------------------------------------------------------------------- > elapsedtime:=time()-starttime; elapsedtime := 19.533 -------------------------------------------------------------------------------- > J[0]; .09994446182 -------------------------------------------------------------------------------- > evalf(Int(sin(t)/t,t=0..0.1)); .09994446111 -------------------------------------------------------------------------------- > Si(0.1); .09994446111 -------------------------------------------------------------------------------- > J[1]; .09961162812 -------------------------------------------------------------------------------- > evalf(Int(sin(t)/t,t=0.1..0.2)); .09961162742 -------------------------------------------------------------------------------- > J[0]+J[1]; .1995560899 -------------------------------------------------------------------------------- > evalf(Int(sin(t)/t,t=0.0..0.2)); .1995560885 -------------------------------------------------------------------------------- > Si(0.2); .1995560885 -------------------------------------------------------------------------------- > starttime:=time(): -------------------------------------------------------------------------------- > for n from 0 to 99 do sum(J[k],k=0..n):Int(sin(t)/t,t=0..x[n+1])=Si(x[n+1]):sum(J[k],k=0..n)-Si(x[n+1]):(n+1)*(0.1)^(5)/(900*16) od:n:='n': -------------------------------------------------------------------------------- > elapsedtime:=time()-starttime; elapsedtime := 5.000 -------------------------------------------------------------------------------- > for n from 0 to 99 do if modp(n,5)=4 then print(sum(J[k],k=0..n),Int(sin(t)/t,t=0..x[n+1])=Si(x[n+1]),sum(J[k],k=0..n)-Si(x[n+1]),(n+1)*(0.1)^(5)/(900*16)) fi od;n:='n': .5 / | sin(t) -8 -8 .4931074214, | ------ dt = .4931074180, .34*10 , .3472222222*10 | t / 0 1.0 / | sin(t) -8 -8 .9460830765, | ------ dt = .9460830704, .61*10 , .6944444444*10 | t / 0 1.5 / | sin(t) -8 -7 1.324683539, | ------ dt = 1.324683531, .8*10 , .1041666667*10 | t / 0 2.0 / | sin(t) -8 -7 1.605412986, | ------ dt = 1.605412977, .9*10 , .1388888888*10 | t / 0 2.5 / | sin(t) -8 -7 1.778520181, | ------ dt = 1.778520173, .8*10 , .1736111111*10 | t / 0 3.0 / | sin(t) -8 -7 1.848652534, | ------ dt = 1.848652528, .6*10 , .2083333333*10 | t / 0 3.5 / | sin(t) -8 -7 1.833125402, | ------ dt = 1.833125399, .3*10 , .2430555555*10 | t / 0 4.0 / | sin(t) -7 1.758203139, | ------ dt = 1.758203139, 0, .2777777777*10 | t / 0 4.5 / | sin(t) -8 -7 1.654140412, | ------ dt = 1.654140414, -.2*10 , .3124999999*10 | t / 0 5.0 / | sin(t) -8 -7 1.549931242, | ------ dt = 1.549931245, -.3*10 , .3472222222*10 | t / 0 5.5 / | sin(t) -8 -7 1.468724070, | ------ dt = 1.468724073, -.3*10 , .3819444444*10 | t / 0 6.0 / | sin(t) -8 -7 1.424687549, | ------ dt = 1.424687551, -.2*10 , .4166666666*10 | t / 0 6.5 / | sin(t) -7 1.421794274, | ------ dt = 1.421794274, 0, .4513888888*10 | t / 0 7.0 / | sin(t) -8 -7 1.454596616, | ------ dt = 1.454596614, .2*10 , .4861111110*10 | t / 0 7.5 / | sin(t) -8 -7 1.510681535, | ------ dt = 1.510681531, .4*10 , .5208333333*10 | t / 0 8.0 / | sin(t) -8 -7 1.574186828, | ------ dt = 1.574186822, .6*10 , .5555555555*10 | t / 0 8.5 / | sin(t) -8 -7 1.629597107, | ------ dt = 1.629597100, .7*10 , .5902777777*10 | t / 0 9.0 / | sin(t) -8 -7 1.665040084, | ------ dt = 1.665040076, .8*10 , .6249999999*10 | t / 0 9.5 / | sin(t) -8 -7 1.674463350, | ------ dt = 1.674463342, .8*10 , .6597222221*10 | t / 0 10.0 / | sin(t) -8 -7 1.658347600, | ------ dt = 1.658347594, .6*10 , .6944444444*10 | t / 0