# WORKSHEET #29
#
# ASYMPTOTIC SERIES
#
#
> restart;
--------------------------------------------------------------------------------
# In this worksheet we consider the problem of computing values of the Sine integral,
# Si(x)=Int(sin(t)/t,t=0..x).
--------------------------------------------------------------------------------
> Si(x)=Int(sin(t)/t,t=0..x);
x
/
| sin(t)
Si(x) = | ------ dt
| t
/
0
--------------------------------------------------------------------------------
# One possible idea is to substitute the Taylor series of sin(t), about t=0, into the integral
# and then integrate term-by-term.
--------------------------------------------------------------------------------
> sin(t)=Sum(((1/(2*k+1)!)*(-1)^k)*(t^(2*k+1)),k=0..infinity);
infinity
----- k (2 k + 1)
\ (-1) t
sin(t) = ) ----------------
/ (2 k + 1)!
-----
k = 0
--------------------------------------------------------------------------------
> sin(t)/t=Sum(((1/(2*k+1)!)*(-1)^k)*(t^(2*k)),k=0..infinity);
infinity
----- k (2 k)
sin(t) \ (-1) t
------ = ) ------------
t / (2 k + 1)!
-----
k = 0
--------------------------------------------------------------------------------
> Int(sin(t)/t,t=0..x)=Sum(((-1)^k)/(2*k+1)!*int(t^(2*k),t=0..x),k=0..infinity);
/ (2 k + 1) (2 k + 1)\
x infinity k | t x |
/ ----- (-1) |limit ---------- + ----------|
| sin(t) \ \t -> 0+ 2 k + 1 2 k + 1 /
| ------ dt = ) ---------------------------------------
| t / (2 k + 1)!
/ -----
0 k = 0
--------------------------------------------------------------------------------
# The limit term is 0, and so
--------------------------------------------------------------------------------
> Si(x)=Sum((-1)^k/((2*k+1)*((2*k+1)!))*x^(2*k+1),k=0..infinity);
infinity
----- k (2 k + 1)
\ (-1) x
Si(x) = ) --------------------
/ (2 k + 1) (2 k + 1)!
-----
k = 0
--------------------------------------------------------------------------------
# This series converges by the alternating series test since the terms do alternate in sign and
# eventually their absolute values decrease monotonically to zero. For small values of x the
# convergence is quite rapid, but it's another matter for large values of x. We will set
# A(k,x) equal to the k^(th) term of the series and then consider the problem of computing
# Si(10) and Si(100) from this alternating series.
--------------------------------------------------------------------------------
> A:=(k,x)->(-1)^k/((2*k+1)*((2*k+1)!))*x^(2*k+1);
k (2 k + 1)
(-1) x
A := (k,x) -> --------------------
(2 k + 1) (2 k + 1)!
--------------------------------------------------------------------------------
# The exact values of the first 21 terms of the series for Si(10) are:
--------------------------------------------------------------------------------
> for k from 0 to 20 do print(k,A(k,10)) od;k:='k':
0, 10
1, -500/9
2, 500/3
125000
3, - ------
441
1562500
4, -------
5103
15625000
5, - --------
68607
390625000
6, ---------
3162159
781250000
7, - ---------
15324309
24414062500
8, -----------
1476241767
1220703125000
9, - -------------
282135852999
6103515625000
10, -------------
6548521640661
305175781250000
11, - ----------------
1814564163190779
6103515625000
12, ---------------
236682282155319
7629394531250000
13, - -------------------
2243037987985958163
190734863281250000
14, ---------------------
489065356861975396503
1907348632812500000
15, - -----------------------
48619842201140519590281
5960464477539062500
16, -------------------------
1707968005065871801090839
11920928955078125000
17, - --------------------------
43113252976359733645717239
1490116119384765625000
18, -----------------------------
75885484274532611178411728817
74505805969238281250000
19, - --------------------------------
59270665136478862984997852731959
186264514923095703125000
20, ----------------------------------
2554717643446691504558497190831361
--------------------------------------------------------------------------------
# This is not too helpful, so we change the above loop by replacing 10 by 10.0. This will
# replace the exact value of A(k,10) by a 10 place approximation.
--------------------------------------------------------------------------------
> for k from 0 to 20 do print(k,A(k,10.0)) od;k:='k':
0, 10.0
1, -55.55555556
2, 166.6666667
3, -283.4467120
4, 306.1924358
5, -227.7464399
6, 123.5311064
7, -50.98109155
8, 16.53798385
9, -4.326650130
10, .9320448125
11, -.1681813118
12, .02578780114
13, -.003401366616
14, .0003899987202
15, -.00003922984005
-5
16, .3489798673*10
-6
17, -.2765026560*10
-7
18, .1963637886*10
-8
19, -.1257043527*10
-10
20, .7291002017*10
--------------------------------------------------------------------------------
# Notice that the absolute values of the terms of the series are initially increasing, but after
# term 4 they begin to decrease, and in fact tend to zero. By the alternating series test the
# sum of the exact values of the terms A(k,10), k=0..20, should approximate Si(10) with an
# error no more than the absolute value of the next term in the sequence, that is
# abs(A(21,10)).
--------------------------------------------------------------------------------
> A(21,10.0);
-11
-.3849327599*10
--------------------------------------------------------------------------------
# Maple knows the exact answer to Si(10). Let's use the exact answer to see if the
# predicted error is reasonable. A speedy way to add up the terms of a series is to use the
# convert command.
--------------------------------------------------------------------------------
> Si(10.0);
1.658347594
--------------------------------------------------------------------------------
> ?convert
--------------------------------------------------------------------------------
# The exact value of Si(10) to 10 places, possibly rounded off in the last place, is
# 1.658347594. The exact value of the sum of the first 21 terms in the series is:
--------------------------------------------------------------------------------
> convert([seq(A(k,10),k=0..20)],`+`);k:='k':
9733366047998806860644040501494565352596170
-------------------------------------------
5869315987738947410279534073197070730772067
--------------------------------------------------------------------------------
> evalf("");
1.658347594
--------------------------------------------------------------------------------
# This is in perfect agreement with the alternating series test. The actual sum of the 10
# place decimal approximations to the first 21 terms is given by:
--------------------------------------------------------------------------------
> s:=convert([seq(A(k,10.0),k=0..20)],`+`);k:='k':
s := 1.658347506
--------------------------------------------------------------------------------
> s-Si(10.0);
-7
-.88*10
--------------------------------------------------------------------------------
# This is the actual error made when we add up the 10 place decimal approximations of the
# first 21 terms, an error that is not too close to the predicted error -.3849327599*10^(-11).
# To see why there is such a large discrepancy consider the terms of the series and the
# partial sums out to k=20. The first term is A(0,10)=10.
--------------------------------------------------------------------------------
> S[0]:=A(0,10);
S[0] := 10
--------------------------------------------------------------------------------
> for k from 1 to 10 do S[k]:=S[k-1]+A(k,10.0) od:k:='k':
--------------------------------------------------------------------------------
> for k from 1 to 10 do print(k,A(k,10.0),S[k]) od;k:='k':\
1, -55.55555556, -45.55555556
2, 166.6666667, 121.1111111
3, -283.4467120, -162.3356009
4, 306.1924358, 143.8568349
5, -227.7464399, -83.8896050
6, 123.5311064, 39.6415014
7, -50.98109155, -11.33959015
8, 16.53798385, 5.19839370
9, -4.326650130, .871743570
10, .9320448125, 1.803788383
--------------------------------------------------------------------------------
# Notice that 5 of the terms, namely those for k=2,3,4,5, and 6, all have absolute values
# more than 100, and only 7 places after the decimal point. The largest absolute value is
# about 306. We can not expect to add these terms up and have an answer which is
# accurate to 9 places after the decimal point. The actual error might be more like
# 5*10^(-7), and in fact it is. One solution is to compute to more decimal places to begin
# with. Calculations to 12 places might be sufficient to give us 10 significant places in our
# answer because 12 places allows for 3 before the decimal point and 9 after in the 5 large
# terms in the sum. The exact value of Si(10) has 1 place before the decimal point and we
# are trying to get 9 places after.
--------------------------------------------------------------------------------
> Digits:=12:
--------------------------------------------------------------------------------
> s:=convert([seq(A(k,10.0),k=0..20)],`+`);k:='k':
s := 1.65834759372
--------------------------------------------------------------------------------
> Digits:=10:
--------------------------------------------------------------------------------
> evalf(""");
1.658347594
--------------------------------------------------------------------------------
> s-Si(10.0);
0
--------------------------------------------------------------------------------
# Rounding off to 10 significant places thus produces the correct value. If we want to
# compute Si(10) to within the truncation error 0.3849327599*10^(-11) then we should be
# carrying 12 places after the decimal point and therefore do our calculations to 15
# significant figures, 3 before the decimal point and 12 after. First we try 14 digits and then
# 15.
--------------------------------------------------------------------------------
> Digits:=14:
--------------------------------------------------------------------------------
> s:=convert([seq(A(k,10.0),k=0..20)],`+`);k:='k':
s := 1.6583475942293
--------------------------------------------------------------------------------
> s-Si(10.0);
-10
.104*10
--------------------------------------------------------------------------------
# Not quite enough, just as we suspected.
--------------------------------------------------------------------------------
> Digits:=15:
--------------------------------------------------------------------------------
> s:=convert([seq(A(k,10.0),k=0..20)],`+`);k:='k':
s := 1.65834759422126
--------------------------------------------------------------------------------
> s-Si(10.0);
-11
.239*10
--------------------------------------------------------------------------------
# This agrees perfectly with our predicted truncation error.
--------------------------------------------------------------------------------
> Digits:=10:
--------------------------------------------------------------------------------
# If we are to use the alternating series for Si(x) as a computational tool we should first
# determine how large k must be in order that the terms abs(A(k,x)) are decreasing. this
# we do by comparing A(k+1,x) with A(k,x).
--------------------------------------------------------------------------------
> abs(A(k+1,x)/A(k,x));
(k + 1) (2 k + 3)
(-1) x (2 k + 1) (2 k + 1)!
abs(-------------------------------------------)
k (2 k + 1)
(2 k + 3) (2 k + 3)! (-1) x
--------------------------------------------------------------------------------
> simplify(");
2
x (2 k + 1)
1/2 abs(------------------)
2
(2 k + 3) (k + 1)
--------------------------------------------------------------------------------
# Thus the terms are decreasing if 2*k+3>x. Now we try x=100. The maximum absolute
# value should occur for k=49.
--------------------------------------------------------------------------------
> for k from 46 to 52 do print(k,A(k,100.0)) od;k:='k':
40
46, .9295421620*10
41
47, -.1019006555*10
41
48, .1071731218*10
41
49, -.1082333624*10
41
50, .1050397302*10
40
51, -.9803933355*10
40
52, .8806952167*10
--------------------------------------------------------------------------------
# From k=49 onward the terms are decreasing. The largest absolute value is in fact
# abs(A(49,100))=0.1082333624*10^(41), a very large term. It is not surprising that adding
# up an alternating series with such large terms is not accurate, unless one does the
# calculations to a great many places. Moreover it is easy to see that the maximum value of
# abs(Si(x)) occurs at x=Pi, and that this value is Si(Pi)=1.851937052.
--------------------------------------------------------------------------------
> plot(sin(t)/t,t=0..20*Pi);
--------------------------------------------------------------------------------
#
** Maple V Graphics **
--------------------------------------------------------------------------------
> evalf(Si(Pi));
1.851937052
--------------------------------------------------------------------------------
# The individual terms in the sum for Si(100) have a maximum absolute value of about
# 10^(40), so if we want to approximate Si(100) to 10 places with this sum we should do
# our calculations to at least 50 places, and perhaps more. Next we estimate how many
# terms are necessary to make the truncation error less than 0.5*10^(-10). We do it by
# experiment.
--------------------------------------------------------------------------------
> A(100,100.0);
23
.3138479130*10
--------------------------------------------------------------------------------
> A(200,100.0);
-72
.9711740670*10
--------------------------------------------------------------------------------
> A(150,100.0);
-17
.3606317547*10
--------------------------------------------------------------------------------
> A(140,100.0);
-8
.7550840789*10
--------------------------------------------------------------------------------
# Thus the vakue of k we are looking for is somewhere between k=141 and k=149.
--------------------------------------------------------------------------------
> for k from 141 to 149 do print(k,A(k,100.0)) od;k:='k':
-9
141, -.9394629422*10
-9
142, .1152545367*10
-10
143, -.1394354050*10
-11
144, .1663668471*10
-12
145, -.1957855579*10
-13
146, .2272770322*10
-14
147, -.2602746120*10
-15
148, .2940689792*10
-16
149, -.3278287386*10
--------------------------------------------------------------------------------
# Thus k=143 should suffice.
--------------------------------------------------------------------------------
> Digits:=50:
--------------------------------------------------------------------------------
> starttime:=time():
--------------------------------------------------------------------------------
> s:=convert([seq(A(k,100.0),k=0..142)],`+`);k:='k':
s := 1.5622254671018448150728932832037677330244317383092
--------------------------------------------------------------------------------
> elapsedtime:=time()-starttime;
elapsedtime := 2.567
--------------------------------------------------------------------------------
# The convert command is indeed quite fast.
--------------------------------------------------------------------------------
> evalf(Si(100));
1.5622254668890562933523451388045026772278249805411
--------------------------------------------------------------------------------
> s-evalf(Si(100));
-9
.2127885217205481443992650557966067577681*10
--------------------------------------------------------------------------------
# This is not quite accurate to 10 places. The problem must be that there are too many
# terms in the series with absolute value near 10^(40).
--------------------------------------------------------------------------------
> Digits:=51:
--------------------------------------------------------------------------------
> starttime:=time():
--------------------------------------------------------------------------------
> s:=convert([seq(A(k,100.0),k=0..142)],`+`);k:='k':
s := 1.56222546696625795842933532621285898862481574590685
--------------------------------------------------------------------------------
> elapsedtime:=time()-starttime;
elapsedtime := 2.467
--------------------------------------------------------------------------------
> s-evalf(Si(100));
-10
.7720166507699018740835631139699076536577*10
--------------------------------------------------------------------------------
# Still not there.
--------------------------------------------------------------------------------
> Digits:=52:
--------------------------------------------------------------------------------
> starttime:=time():
--------------------------------------------------------------------------------
> s:=convert([seq(A(k,100.0),k=0..142)],`+`);k:='k':
s := 1.562225466904483402648495792398277959940529764588085
--------------------------------------------------------------------------------
> elapsedtime:=time()-starttime;
elapsedtime := 3.184
--------------------------------------------------------------------------------
> s-evalf(Si(100));
-10
.15427109296150653593775282712704784047002*10
#
--------------------------------------------------------------------------------
> Digits:=53:
--------------------------------------------------------------------------------
> s:=convert([seq(A(k,100.0),k=0..142)],`+`);k:='k':
s := 1.5622254669021758132370188522007506652086266569193657
--------------------------------------------------------------------------------
> s-evalf(Si(100));
-10
.131195198846737133962479879808016763782822*10
--------------------------------------------------------------------------------
# This is now in quite good agreement with the truncation error A(143,100).
--------------------------------------------------------------------------------
> A(143,100.0);
-10
-.13943540504088827334043593535271574839854399819848964*10
--------------------------------------------------------------------------------
> Digits:=10:
--------------------------------------------------------------------------------
# If we do not carry 53 significant digits then the actual error can be very far removed from
# the predicted error, that is from the truncation error. Consider the next calculation. Here
# we are using only 10 places for the terms in the series.
--------------------------------------------------------------------------------
> s:=convert([seq(A(k,100.0),k=0..142)],`+`);k:='k':
31
s := -.3538632006*10
--------------------------------------------------------------------------------
# What a ridiculous answer!
--------------------------------------------------------------------------------
# It is quite clear that alternating series have limited use if the the series has large terms
# and the limit is relatively small. Fortunately there are other ways of estimating the Sine
# integral.
--------------------------------------------------------------------------------
> Si(x)=Int(sin(t)/t,t=0..infinity)-Int(sin(t)/t,t=x..infinity);
infinity infinity
/ /
| sin(t) | sin(t)
Si(x) = | ------ dt - | ------ dt
| t | t
/ /
0 x
--------------------------------------------------------------------------------
# The exact value of Si(infinity)=Int(sin(t)/t,t=0..infinity) is Pi/2, so the problem of
# computing Si(x) becomes the problem of computing the complementary Sine integral
# Int(sin(t)/t,t=x..infinity).
--------------------------------------------------------------------------------
> Si(infinity);
1/2 Pi
--------------------------------------------------------------------------------
> Sic:=x->Int(sin(t)/t,t=x..infinity);
infinity
/
| sin(t)
Sic := x -> | ------ dt
| t
/
x
--------------------------------------------------------------------------------
# We can substitute the Taylor series for sin(t)/t into the integral, but we can no longer
# integrate term-by-term. We need another idea.
--------------------------------------------------------------------------------
> with(student):
--------------------------------------------------------------------------------
> B[1]:=Sic(x);
infinity
/
| sin(t)
B[1] := | ------ dt
| t
/
x
--------------------------------------------------------------------------------
# In the next calculation we integrate repeatedly by parts.
--------------------------------------------------------------------------------
> starttime:=time():
--------------------------------------------------------------------------------
> for k from 2 to 150 do B[k]:=intparts(B[k-1],1/t^(k-1)) od:k:='k':
--------------------------------------------------------------------------------
> elapsedtime:=time()-starttime;
elapsedtime := 16.150
--------------------------------------------------------------------------------
> B[10];
cos(x) sin(x) cos(x) sin(x) cos(x) sin(x) cos(x)
------ + ------ - 2 ------ - 6 ------ + 24 ------ + 120 ------ - 720 ------
x 2 3 4 5 6 7
x x x x x x
infinity
/
sin(x) cos(x) | cos(t)
- 5040 ------ + 40320 ------ - | 362880 ------ dt
8 9 | 10
x x / t
x
--------------------------------------------------------------------------------
# Notice that the first 9 terms in B[10] can easily be computed for any value of x, but that
# the tenth term, the integral that is, can only be estimated. Thus the idea is to use the
# non-integral terms to approximate Sic(x) and then estimate the integral to determine the
# error. This means we have to be able to select the non-integral terms from the
# expressions B[k], and also the integral term. This is done by the operand command.
--------------------------------------------------------------------------------
> ?op
--------------------------------------------------------------------------------
# Looking at B[10] we see that the number of operands is 10 and that the tenth operand is
# the integral term.
--------------------------------------------------------------------------------
> nops(B[10]);
10
--------------------------------------------------------------------------------
> op(10,B[10]);
infinity
/
| cos(t)
- | 362880 ------ dt
| 10
/ t
x
--------------------------------------------------------------------------------
> B[10]-op(10,B[10]);
cos(x) sin(x) cos(x) sin(x) cos(x) sin(x) cos(x)
------ + ------ - 2 ------ - 6 ------ + 24 ------ + 120 ------ - 720 ------
x 2 3 4 5 6 7
x x x x x x
sin(x) cos(x)
- 5040 ------ + 40320 ------
8 9
x x
--------------------------------------------------------------------------------
# This last expression is our approximation to Sic(x) and the expression before this one is
# the error. Unfortunately Maple does not always give the terms of integration by parts in
# the same order so we have to sort them first. For example consider B[25].
--------------------------------------------------------------------------------
> B[25];
sin(x) cos(x) cos(x) sin(x) sin(x)
120 ------ - 720 ------ + 40320 ------ - 5040 ------ + 362880 ------
6 7 9 8 10
x x x x x
cos(x) sin(x) cos(x)
- 3628800 ------ - 39916800 ------ + 479001600 ------
11 12 13
x x x
sin(x) cos(x) sin(x)
+ 51090942171709440000 ------ - 87178291200 ------ + 6227020800 ------
22 15 14
x x x
sin(x) sin(x) cos(x)
- 1307674368000 ------ + 355687428096000 ------ + 20922789888000 ------
16 18 17
x x x
sin(x) cos(x) cos(x) sin(x)
+ ------ - 2 ------ - 6402373705728000 ------ - 121645100408832000 ------
2 3 19 20
x x x x
sin(x) cos(x) cos(x)
- 6 ------ + 2432902008176640000 ------ - 1124000727777607680000 ------
4 21 23
x x x
infinity
/
cos(x) | sin(t) cos(x)
+ ------ + | 620448401733239439360000 ------ dt + 24 ------
x | 25 5
/ t x
x
sin(x)
- 25852016738884976640000 ------
24
x
--------------------------------------------------------------------------------
> ?sort
--------------------------------------------------------------------------------
> sort(B[25]);
infinity
/
| sin(t) cos(x) sin(x) cos(x)
| 620448401733239439360000 ------ dt + ------ + ------ - 2 ------
| 25 x 2 3
/ t x x
x
sin(x) cos(x) sin(x) cos(x) sin(x)
- 6 ------ + 24 ------ + 120 ------ - 720 ------ - 5040 ------
4 5 6 7 8
x x x x x
cos(x) sin(x) cos(x) sin(x)
+ 40320 ------ + 362880 ------ - 3628800 ------ - 39916800 ------
9 10 11 12
x x x x
cos(x) sin(x) cos(x)
+ 479001600 ------ + 6227020800 ------ - 87178291200 ------
13 14 15
x x x
sin(x) cos(x) sin(x)
- 1307674368000 ------ + 20922789888000 ------ + 355687428096000 ------
16 17 18
x x x
cos(x) sin(x)
- 6402373705728000 ------ - 121645100408832000 ------
19 20
x x
cos(x) sin(x)
+ 2432902008176640000 ------ + 51090942171709440000 ------
21 22
x x
cos(x) sin(x)
- 1124000727777607680000 ------ - 25852016738884976640000 ------
23 24
x x
> for k from 1 to 150 do Err[k]:=op(1,sort(B[k])); C[k]:=B[k]-Err[k] od:k:='k':
--------------------------------------------------------------------------------
# Sorting the terms of B[k] puts the integral first which we can then select by the operand
# command. Err[k] is the integral term, that is the error when we approximate Sic(x), and
# C[k] is the approximation.
--------------------------------------------------------------------------------
> Err[25];
infinity
/
| sin(t)
| 620448401733239439360000 ------ dt
| 25
/ t
x
--------------------------------------------------------------------------------
> 24!;
620448401733239439360000
--------------------------------------------------------------------------------
> sort(C[25]);
cos(x) sin(x) cos(x) sin(x) cos(x) sin(x) cos(x)
------ + ------ - 2 ------ - 6 ------ + 24 ------ + 120 ------ - 720 ------
x 2 3 4 5 6 7
x x x x x x
sin(x) cos(x) sin(x) cos(x)
- 5040 ------ + 40320 ------ + 362880 ------ - 3628800 ------
8 9 10 11
x x x x
sin(x) cos(x) sin(x)
- 39916800 ------ + 479001600 ------ + 6227020800 ------
12 13 14
x x x
cos(x) sin(x) cos(x)
- 87178291200 ------ - 1307674368000 ------ + 20922789888000 ------
15 16 17
x x x
sin(x) cos(x)
+ 355687428096000 ------ - 6402373705728000 ------
18 19
x x
sin(x) cos(x)
- 121645100408832000 ------ + 2432902008176640000 ------
20 21
x x
sin(x) cos(x)
+ 51090942171709440000 ------ - 1124000727777607680000 ------
22 23
x x
sin(x)
- 25852016738884976640000 ------
24
x
--------------------------------------------------------------------------------
# The error term will have the form Err[k]=(k-1)!*Int(trig(t)/t^k,t=x..infinity), where
# trig(t) is one of the 4 functions sin(t), cos(t), -sin(t) or -cos(t). This allows us to find an
# easy bound on the error.
--------------------------------------------------------------------------------
> Err[k]=(k-1)!*Int(trig(t)/t^k,t=x..infinity);
infinity
/
| trig(t)
Err[k] = (k - 1)! | ------- dt
| k
/ t
x
--------------------------------------------------------------------------------
> abs(Err[k])<(k-1)!*int(t^(-k),t=x..infinity);
/ (- k + 1) (- k + 1)\
| t x |
abs(Err[k]) < (k - 1)! |limit ---------- + ----------|
\t -> infinity- - k + 1 k - 1 /
--------------------------------------------------------------------------------
# The limit term is zero for k>1 and therefore we have.
--------------------------------------------------------------------------------
> abs(Err[k])<(k-2)!/x^(k-1);
(k - 2)!
abs(Err[k]) < --------
(k - 1)
x
--------------------------------------------------------------------------------
> Bound:=(k,x)->(k-2)!/x^(k-1);
(k - 2)!
Bound := (k,x) -> --------
(k - 1)
x
--------------------------------------------------------------------------------
> Bound(k,x)/Bound(k-1,x);
(k - 2)
(k - 2)! x
-----------------
(k - 1)
x (k - 3)!
--------------------------------------------------------------------------------
> simplify(");
k - 2
-----
x
--------------------------------------------------------------------------------
# Keeping x fixed and letting k vary we see that the bound on the error,Bound(k,x), is the
# smallest when k=floor(x+2). For larger or smaller values of k the bound is bigger.
# Moreover, Limit(Bound(k,x),k=infinity)=infinity, and therefore there is definitely a limit
# on the amount of accuracy obtainable this way. In fact Limit(Err[k],k=infinity)=infinity
# and the approximating series, that is, Limit(C[k],k=infinity), actually diverges. We
# conclude with a few examples.
--------------------------------------------------------------------------------
> for k from 10 to 14 do print(k,Bound(k,10.0)) od;k:='k':
10, .00004032000000
11, .00003628800000
12, .00003628800000
13, .00003991680000
14, .00004790016000
--------------------------------------------------------------------------------
# Thus the bound on the error estimate is smallest for k=11 or 12. There is clearly no point
# in using more than 11 terms. Thus we predict that C[10] should be the best
# approximation.
--------------------------------------------------------------------------------
> evalf(Sic(10));
-.08755126742
--------------------------------------------------------------------------------
> for k from 2 to 20 do print(k,evalf(subs(x=10.0,C[k])),abs(evalf(subs(x=10.0,C[k]))-evalf(Sic(10)))) od;k:='k':
2, -.08390715291, .00364411451
3, -.08934736402, .00179609660
4, -.08766922096, .00011795354
5, -.08734280829, .00020845913
-5
6, -.08754418546, .708196*10
7, -.08760946800, .00005820058
-5
8, -.08754905485, .221257*10
9, -.08752163618, .00002963124
-5
10, -.08755546754, .420012*10
11, -.08757520898, .00002394156
-5
12, -.08754476076, .650666*10
13, -.08752304518, .00002822224
14, -.08756323687, .00001196945
15, -.08759711318, .00004584576
16, -.08752396435, .00002730307
17, -.08745282410, .00009844332
18, -.08762838127, .00007711385
19, -.08782188274, .00027061532
20, -.08728467777, .00026658965
--------------------------------------------------------------------------------
# From these results we see that the best approximation is actually C[8] and not C[10]. The
# reason for this is that in obtaining the bound we replaced abs(trig(t)) by 1, thereby
# making the error approximation bigger.
--------------------------------------------------------------------------------
> evalf(Sic(100));
.008570859906
--------------------------------------------------------------------------------
> for k from 92 to 112 do print(k,Bound(k,100.0)) od;k:='k':
-43
92, .1485715964*10
-43
93, .1352001528*10
-43
94, .1243841405*10
-43
95, .1156772507*10
-43
96, .1087366157*10
-43
97, .1032997849*10
-44
98, .9916779349*10
-44
99, .9619275968*10
-44
100, .9426890449*10
-44
101, .9332621544*10
-44
102, .9332621544*10
-44
103, .9425947760*10
-44
104, .9614466715*10
-44
105, .9902900716*10
-43
106, .1029901675*10
-43
107, .1081396758*10
-43
108, .1146280564*10
-43
109, .1226520203*10
-43
110, .1324641819*10
-43
111, .1443859583*10
-43
112, .1588245542*10
--------------------------------------------------------------------------------
> Digits:=45:
--------------------------------------------------------------------------------
> starttime:=time():
--------------------------------------------------------------------------------
> for k from 90 to 112 do print(k,evalf(subs(x=100.0,C[k])),abs(evalf(subs(x=100.0,C[k]))-evalf(Sic(100)))) od;k:='k':
-43
90, .00857085990584032587897655283524876487075973083, .1168*10
-44
91, .00857085990584032587897655283524876487075972247, .332*10
-44
92, .00857085990584032587897655283524876487075970960, .955*10
-44
93, .00857085990584032587897655283524876487075971648, .267*10
-44
94, .00857085990584032587897655283524876487075972722, .807*10
-44
95, .00857085990584032587897655283524876487075972129, .214*10
-44
96, .00857085990584032587897655283524876487075971200, .715*10
-44
97, .00857085990584032587897655283524876487075971723, .192*10
-44
98, .00857085990584032587897655283524876487075972579, .664*10
-44
99, .00857085990584032587897655283524876487075972091, .176*10
-44
100, .00857085990584032587897655283524876487075971279, .636*10
-44
101, .00857085990584032587897655283524876487075971749, .166*10
-44
102, .00857085990584032587897655283524876487075972555, .640*10
-44
103, .00857085990584032587897655283524876487075972077, .162*10
-44
104, .00857085990584032587897655283524876487075971248, .667*10
-44
105, .00857085990584032587897655283524876487075971749, .166*10
-44
106, .00857085990584032587897655283524876487075972638, .723*10
-44
107, .00857085990584032587897655283524876487075972090, .175*10
-44
108, .00857085990584032587897655283524876487075971116, .799*10
-44
109, .00857085990584032587897655283524876487075971735, .180*10
-44
110, .00857085990584032587897655283524876487075972866, .951*10
-44
111, .00857085990584032587897655283524876487075972135, .220*10
-43
112, .00857085990584032587897655283524876487075970766, .1149*10
--------------------------------------------------------------------------------
> elapsedtime:=time()-starttime;
elapsedtime := 59.933
--------------------------------------------------------------------------------
# This is a much better way of computing Si(100) then our previous approach using Taylor
# series. Si(100) to high accuracy is given by:
--------------------------------------------------------------------------------
> evalf(subs(x=100.0,C[102]));
.00857085990584032587897655283524876487075972555
--------------------------------------------------------------------------------