hp41programs

Airy

Airy Functions & Related Functions for the HP-41


Overview
 

 1°)  Airy Functions Ai & Bi

  1-a)  Ascending Series ( 2 programs )
  1-b)  Asymptotic Expansion for Ai(x) & Bi(x), large positive arguments
  1-c)  Asymptotic Expansion for Ai(x) & Bi(x) , large negative arguments

 2°)  Scorer Functions Gi & Hi

  1-a)  Ascending Series
  1-b)  Asymptotic Expansion for Gi(x)
 
 

1°)  Airy Functions Ai & Bi
 

     a)  Ascending Series
 

    Ai(x) =   f(x) - g(x)                             with            f(x) = [ 3 -2/3 / Gamma(2/3) ] [ 1 + x3/3! + ( 1 . 4 x6 )/6! + ( 1 . 4 . 7 x9 )/9! + .....  ]
    Bi(x) = [ f(x) + g(x) ] sqrt(3)               and            g(x) = [ 3 -1/3 / Gamma(1/3) ] [ x + 2 x4/4! + ( 2 . 5 x7 )/7! + ( 2 . 5 . 8 x10 )/10! + .....  ]
 

Data Registers:   R00 to R05: temp
Flags: /
Subroutine:  "GAM"  ( cf "Gamma Function for the HP-41" )
 
 
 

01  LBL "AIRY"
02  STO 02
03  STO 05
04  3
05  Y^X
06  STO 00
07  CLX
08  STO 03
09  SIGN
10  STO 01
11  STO 04
12  LBL 01
13  RCL 00
14  RCL 03
15  1
16  +
17  STO 03       
18  3
19  *
20  /
21  ST* 04
22  ST* 05
23  LASTX
24  DSE X
25  ST/ 04
26  LASTX
27  1
28  +
29  ST/ 05
30  RCL 04
31  RCL 01       
32  +
33  STO 01
34  LASTX
35  RCL 05
36  RCL 02
37  +
38  STO 02
39  RDN
40  X#Y?
41  GTO 01
42  R^
43  LASTX
44  X#Y?
45  GTO 01
46  2
47  3
48  STO Z
49  /
50  Y^X
51  ST/ 01
52  LASTX
53  XEQ "GAM"
54  ST/ 01
55  3
56  ENTER^
57  1/X
58  Y^X
59  ST/ 02
60  LASTX
61  XEQ "GAM"
62  ST/ 02
63  RCL 01
64  RCL 02
65  +
66  3
67  SQRT
68  *
69  RCL 01
70  RCL 02
71  -
72  END

 

 
    ( 102 bytes / SIZE 006 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /          Bi(x)
           X             x          Ai(x)

 
Example:

  0.4  XEQ "AIRY"  >>>>   Ai(0.4) = 0.254742355           ---Execution time = 9s---
                               X<>Y   Bi(0.4) = 0.801773001
 

   3   R/S   >>>>  Ai(3) = 0.006591141   X<>Y   Bi(3) = 14.03732897   ( in 15 seconds )

Note:

-Several bytes may be saved if you have loaded "0F1" in your HP-41 ( cf "Hypergeometric Functions for the HP-41" §3 )
 
 

01  LBL "AIRY"
02  STO 03
03  3
04  Y^X
05  9
06  /
07  2
08  3
09  /
10  STO 01
11  X<>Y
12  XEQ "0F1"  
13  3
14  RCL 01
15  Y^X
16  /
17  STO 02
18  RCL 01
19  XEQ "GAM"
20  ST/ 02
21  2
22  ST* 01
23  RCL 00
24  XEQ "0F1"
25  3
26  ENTER^
27  1/X
28  Y^X
29  /
30  ST* 03
31  3
32  1/X
33  XEQ "GAM"
34  ST/ 03
35  RCL 02
36  RCL 03
37  +
38  3
39  SQRT
40  *
41  RCL 02       
42  RCL 03
43  -
44  END

 
   ( 74 bytes / SIZE 004 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /          Bi(x)
           X             x          Ai(x)

 
Example:

  0.4  XEQ "AIRY"  >>>>   Ai(0.4) = 0.254742355           ---Execution time = 11s---
                               X<>Y   Bi(0.4) = 0.801773001
 

     b)  Asymptotic Expansion for Ai(x) & Bi(x) , Large Positive Arguments
 

    Ai(x) ~ ( x -1/4 / [ 2.sqrt(PI) exp(z) ] )  Sumk=0,1,2,.... (-1)k ck z -k

  where  z = (2/3) x3/2  ;  c0 = 1 ,  ck = ck-1 ( 6k -5 )( 6k - 1 ) / (72 k )
 
 

Data Registers:      R00 = x , R01 = Sum , R02 to R04: temp

Flag:  F03   If F03 is clear at the end, the accuracy is maximum.
                    If F03 is set at the end, the series have been truncated just before the term begins to increase

Subroutines: /
 
 

01  LBL "AI+"
02  SF 03
03  STO 00    
04  1.5
05  Y^X
06  LASTX
07  /
08  CHS
09  STO 04
10  CLX
11  STO 02
12  SIGN
13  STO 01 
14  STO 03    
15  LBL 01
16  RCL 03
17  RCL 02
18  6
19  *
20  1
21  ST+ 02
22  +
23  ST* Y
24  4
25  +
26  *
27  72
28  RCL 02 
29  *
30  RCL 04    
31  *
32  /
33  ABS
34  LASTX
35  X<> 03
36  ABS
37  X<=Y?
38  GTO 02
39  RCL 03
40  RCL 01 
41  +
42  STO 01    
43  LASTX
44  X#Y?
45  GTO 01
46  CF 03
47  LBL 02
48  RCL 03
49  RCL 01
50  RCL 04
51  E^X
52  *
53  RCL 00    
54  SQRT
55  PI
56  *
57  SQRT
58  ST+ X
59  /
60  END

 
   ( 79 bytes / SIZE 005 )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /          eps
           X          x > 0         Ai(x)

  where  eps is the first neglected term in the series

Examples:

   10  XEQ "AI+"   >>>>   Ai(10) = 1.104753252 10 -10     F03 is clear     ---Execution time = 11s---

    5       R/S           >>>>    Ai(5)  = 0.0001083444261       F03 is set        ---Execution time = 19s---
                             X<>Y     eps   = 3.5 10 -8

   R03 = eps is an estimation of the relative error, whence the absolute error is about 3.8 10 -12  for Ai(5)

Notes:

 "AIRY" returns accurate results for Bi(x)  ( x > 0 , x large ), but if you want to use an asymptotic series for Bi,

  Delete lines 58-36 , replace lines 33-34 by  ENTER^  and delete line 08

-It will yield for example Bi(10) = 455641154.0  ( "AIRY"  gives  455641153.9 )

-These asymptotic series may also be expressed in terms of hypergeometric functions, namely:

     Ai(x) ~ { 1/2sqrt[ pi sqrt(x) ]  }  exp ( -2/3 x3/22F0( 1/6 , 5/6 ; -3/(4x3/2) )
     Bi(x) ~ { 1/sqrt[ pi sqrt(x) ]  }  exp ( 2/3 x3/22F0( 1/6 , 5/6 ; 3/(4x3/2) )

-The following variant uses the M-Code routine HGF+  ( cf "Hypergeometric functions for the HP-41" )
 
 
 

01  LBL "AIBI+"
02  STO 00       
03  6
04  1/X
05  STO 01
06  5
07  LASTX
08  /
09  STO 02
10  0
11  RCL 00       
12  1.5
13  Y^X
14  LASTX
15  /
16  STO 03
17  1/X
18  2
19  STO T
20  /
21  CHS
22  HGF+
23  STO 04       
24  2
25  0
26  LASTX
27  CHS
28  HGF+
29  RCL 03
30  E^X
31  *
32  RCL 04       
33  RCL 03
34  CHS
35  E^X
36  *
37  PI
38  RCL 00       
39  SQRT
40  *
41  SQRT
42  ST/ Z
43  ST+ X
44  /
45  END

 
    ( 63 bytes )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /         Bi(x)
           X          x > 0         Ai(x)

 
Example:

  6.4   XEQ "AIBI+"  >>>>   Ai(6.4) = 0.000003617762307                    ---Execution time = 11s---
                                  RDN   Bi(6.4) = 17400.13559

-With x = 6.3 ,  the series diverge too soon:  press any key to stop the infinite loop.
 

     c)  Asymtotic Expansion for Ai(x) & Bi(x) , Large Negative Arguments
 

 With  x > 0    Ai(-x) ~ ( x -1/4 / sqrt(PI) ) [ S sin ( z + 45° ) - T cos ( z + 45° ) ]
                      Bi(-x) ~ ( x -1/4 / sqrt(PI) ) [ S cos ( z + 45° ) + T sin ( z + 45° ) ]

    where   z = (2/3) x3/2    ;     S = Sumk=0,1,2,.... (-1)k c2k z -2k    ,    T = Sumk=0,1,2,.... (-1)k c2k+1 z -2k-1

       and       c0 = 1 ,  ck = ck-1 ( 6k -5 )( 6k - 1 ) / (72 k )
 

Data Registers:      R00 = -x , R01 = S , R02 = T , R03 to R05: temp

Flags:  F10 & F03   If F03 is clear at the end, the accuracy is maximum.
                                 If F03 is set at the end, the series have been truncated just before the term begins to increase

Subroutines: /
 
 

  01  LBL "AIBI-"
  02  CHS
  03  STO 00
  04  1.5
  05  Y^X
  06  LASTX
  07  /
  08  STO 05
  09  CLX
  10  STO 02
  11  STO 03
  12  SIGN
  13  STO 01
  14  STO 04
  15  SF 03
  16  SF 10
  17  GTO 01
  18  LBL 00
  19  RCL 04
  20  RCL 03
  21  6
  22  *
  23  1
  24  ST+ 03
  25  +
  26  ST* Y
  27  4
  28  +
  29  *
  30  72
  31  RCL 03       
  32  *
  33  RCL 05
  34  *
  35  /
  36  RTN
  37  LBL 01
  38  XEQ 00
  39  ABS
  40  LASTX
  41  X<> 04
  42  ABS
  43  X<=Y?
  44  GTO 02
  45  RCL 04
  46  RCL 02
  47  +
  48  STO 02
  49  LASTX
  50  X=Y?
  51  CF 10
  52  XEQ 00 
  53  CHS
  54  ABS
  55  LASTX
  56  X<> 04
  57  ABS
  58  X<=Y?
  59  GTO 02
  60  RCL 04      
  61  RCL 01
  62  +
  63  STO 01
  64  LASTX
  65  X=Y?
  66  FS? 10
  67  GTO 01
  68  CF 03
  69  LBL 02
  70  DEG
  71  RCL 05 
  72  R-D
  73  45
  74  +
  75  1
  76  P-R
  77  RCL 01
  78  X<>Y
  79  *
  80  RCL 02      
  81  LASTX
  82  *
  83  CHS
  84  RCL 01
  85  R^
  86  *
  87  ST+ Y
  88  X<> Z
  89  RCL 02 
  90  LASTX
  91  *
  92  +
  93  RCL 00      
  94  SQRT
  95  PI
  96  *
  97  SQRT
  98  ST/ Z
  99  /
100  RCL04
101  X<> Z
102  END

 
     ( 137 bytes / SIZE 006 )
 
 

      STACK        INPUTS      OUTPUTS
           Z             /           eps
           Y             /          Bi(x)
           X          x < 0          Ai(x)

    where  eps is the first neglected term in the series

Examples:

   -10  XEQ "AIBI-"  >>>>   Ai(-10) = 0.04024123578                                 ---Execution time = 19s---
                                 X<>Y  Bi(-10) =  -0.314679830      ( F03 is clear )

    -5       R/S       >>>>    Ai(-5) =  0.350761000                                           ---Execution time = 21s---
                            RDN    Bi(-5) = -0.138369139        ( F03 is set )
                           X<>Y     eps   =  3.5 E-8

Note:

-As usual, the M-Code routine HGF+ may simplify the program:
 
 

01  LBL "AIBI-"
02  DEG
03  CHS
04  STO 00      
05  1
06  STO 01
07  5
08  STO 02
09  7
10  STO 03
11  11
12  STO 04
13  .5
14  STO 05
15  1/X
16  X^2
17  12
18  ST/ 01
19  ST/ 02
20  ST/ 03
21  ST/ 04
22  SIGN
23  RCL 00      
24  3
25  Y^X
26  4
27  *
28  9
29  /
30  STO 06
31  1/X
32  CHS
33  HGF+
34  STO 07
35  1
36  ST+ 01
37  ST+ 02
38  ST+ 05
39  4
40  X<>Y
41  LASTX 
42  HGF+
43  5
44  *
45  RCL 00      
46  RCL 05
47  Y^X
48  48
49  *
50  /
51  RCL 06      
52  SQRT
53  R-D
54  45
55  +
56  STO 06 
57  X<>Y
58  P-R
59  RCL 06
60  RCL 07
61  P-R
62  ST+ T
63  RDN
64  X<>Y
65  -
66  PI
67  RCL 00      
68  SQRT
69  *
70  SQRT
71  ST/ Z
72  /
73  END

 
    ( 99 bytes )
 
 

      STACK        INPUTS      OUTPUTS
           Y             /         Bi(x)
           X          x < 0         Ai(x)

 
Example:

     -7.4   XEQ "AIBI-"  >>>>   Ai(-7.4) =   0.341323752                   ---Execution time = 12s---
                                     RDN    Bi(-7.4) =  -0.021596519

-With x = -7.3 ,  the series diverge too soon:  press any key to stop the infinite loop ( or  ENTER^  ON ).
 

2°)  Scorer Functions Gi & Hi
 

     a)  Ascending Series
 

  Gi(x) = ( 1/Pi ) §0infinity  Sin ( t3 / 3  + t x ) dt   and   Hi(x) = ( 1/Pi ) §0infinity  Exp ( - t3 / 3  + t x ) dt

  Gi  is also the solution of the differential equation  w''(x) - x w = -1 / Pi     with Gi (0) = 3 -7/6 Gam(2/3)  &  Gi'(0) = 3 -5/6 Gam(1/3)
  Hi  --------------------------------------------   w''(x) - x w = + 1 / Pi   with Hi(0) = 2 Gi(0) & Hi'(0) = 2 Gi'(0)

"SCO"  calculates Gi(x) & Hi(x) by a series expansion
 

Data Registers:  R00 thru R05:  temp
Flag:   F01    CF 01 <-> Gi(x)
                      SF 01 <-> Hi(x)

Subroutines: /

-Line 32 = X+1  may be replaced by  ISG X  CLX
 
 

 01  LBL "SCO"
 02  STO 01
 03  .1494294525
 04  FS? 01
 05  ST+ X
 06  STO 03
 07  *
 08  .2049755425
 09  FS? 01
 10  ST+ X
 11  STO 02
 12  +
 13  PI
 14  ST+ X
 15  1/X
 16  FC? 01
 17  CHS
 18  STO 04        
 19  RCL 01
 20  2
 21  STO 00
 22  Y^X
 23  STO 05
 24  *
 25  +
 26  LBL 01
 27  RCL 04        
 28  X<> 03
 29  X<> 02
 30  RCL 00
 31  ENTER^
 32  X+1
 33  STO 00
 34  *
 35  /
 36  STO 04        
 37  RCL 01
 38  RCL 05
 39  *
 40  STO 05        
 41  *
 42  +
 43  X#Y?
 44  GTO 01
 45  END

 
   ( 83 bytes / SIZE 006 )
 
 

      STACK        INPUT      OUTPUT
           X             x    Gi(x) or Hi(x)

    Where  X' = Gi(x)  if  flag F01 is clear
                X' = Hi(x)  if  flag F01 is set

Example:    Calculate  Gi(PI) & Hi(PI)

  •  CF 01

     PI  XEQ "SCO"  >>>>   Gi(PI) = 0.108572692                          ---Execution time = 21s---
 
  •  SF 01

     PI  XEQ "SCO"  >>>>   Hi(PI) = 17.63876165                          ---Execution time = 19s---
 

Note:

-We have  for all x ,  Gi(x) +Hi(x) = Bi(x)
 

     b)  Asymptotic Expansion for Gi(x) , Large Positive Arguments
 

-If x is a large positive integer, "SCO" produces inaccurate or even meaningless results
-The following asymptotic series may be used instead:

          Gi(x) ~ ( 1 / (x.Pi) )  Sumk=0,1,2,.....  (3k)! / k! / ( 3x3 )k
 

Data Registers:  R00 thru R03: temp
Flags: /
Subroutines: /
 
 

 01  LBL "AEGI"
 02  STO 01
 03  3
 04  Y^X
 05  STO 03
 06  CLX
 07  STO 00
 08  SIGN
 09  STO 02
 10  LBL 01
 11  RCL 00
 12  1
 13  +
 14  STO 00
 15  3
 16  *
 17  DSE X
 18  ENTER^
 19  DSE X
 20  RCL 02
 21  *
 22  *
 23  RCL 03
 24  /
 25  STO 02
 26  +
 27  X#Y?
 28  GTO 01
 29  PI
 30  RCL 01
 31  *
 32  /
 33  END

 
   ( 45 bytes / SIZE 004 )
 
 

      STACK        INPUT      OUTPUT
           X          x > 0         Gi(x)

 
Example:    Calculate  Gi(10.3) & Gi(100)

    10.3  XEQ "AEGI"  >>>>  Gi(10.3)  =  0.03096153019                     ---Execution time = 8s---
     100       R/S           >>>>   Gi(100)  =  0.003183105228                    ---Execution time = 2s---

Note:

-The series already diverges too soon if  x = 10.2
 

References:

[1]  Abramowitz and Stegun - "Handbook of Mathematical Functions" -  Dover Publications -  ISBN  0-486-61272-4
[2]   http://functions.wolfram.com/