2.18 ASYMPTOTIC SERIES

# 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
--------------------------------------------------------------------------------