Fresnel

# Fresnel Integrals for the HP-41

Overview

1°) Ascending Series
2°) Asymptotic Series
3°) Ascending Series & Complex Continued Fraction

1°) Ascending Series

-Fresnel integrals are defined by:    S(x) = §0x  sin(pi.t2/2).dt      and      C(x) = §0x  cos(pi.t2/2).dt

Formulae:

S(x) = SUMn=0,1,2,.....  (-1)n (pi/2)2n+1 x4n+3 / ((2n+1)!(4n+3))

C(x) = SUMn=0,1,2,.....  (-1)n (pi/2)2n x4n+1 / ((2n)!(4n+1))

Data Registers:  R00 = x ; R01 to R03: temp
Flags: /
Subroutines: /

 01  LBL "SX" 02  STO 00 03  3 04  Y^X 05  PI 06  6 07  / 08  * 09  1 10  STO 02 11  GTO 00 12  LBL "CX" 13  STO 00 14  0 15  STO 02 16  LBL 00 17  RCL 00 18  X^2 19  PI 20  * 21  2 22  / 23  X^2 24  CHS 25  STO 03     26  R^ 27  STO 01 28  LBL 01 29  RCL 01 30  RCL 02 31  2 32  + 33  STO 02 34  ST+ X 35  3 36  - 37  ST* Y      38  4 39  + 40  RCL 02 41  ST* Y 42  DSE X 43  * 44  / 45  RCL 03 46  * 47  STO 01     48  + 49  X#Y? 50  GTO 01 51  END

( 69 bytes / SIZE 004 )

 STACK INPUTS OUTPUTS X x S(x) or C(x)

Example:

2  XEQ "SX"  >>>>  S(2) = 0.343415677    ( in 14 seconds )
2  XEQ "CX" >>>>  C(2) = 0.488253412      --------------

Note:   This method does not give accurate results for large arguments:

S(3) and C(3) are correct to 5 decimals
S(3.5) and C(3.5) -----------  4 --------
S(4) and C(4) are not exact even to 1D!

2°) Asymptotic Series ( large arguments )

Formulae:       S(x) = 1/2 - f(x).cos(pi.x2/2) - g(x).sin(pi.x2/2)     &     C(x) = 1/2 + f(x).sin(pi.x2/2) - g(x).cos(pi.x2/2)

where               f(x) ~  ( 1 - 1*3/(pi.x2)2 + 1*3*5*7/(pi.x2)4 - ....... ) / (pi.x)
and                g(x) ~  ( 1 - 1*3*5/(pi.x2)2 + 1*3*5*7*9/(pi.x2)4 - ....... ) / (pi2.x3)

Data Registers:   R00 = x ; R01 to R04: temp
Flags: /
Subroutines: /

 01  LBL "FSC" 02  STO 00 03  X^2 04  PI 05  * 06  STO 03 07  SIGN 08  STO 01 09  LASTX 10  1/X 11  STO 02 12  XEQ 01 13  STO 04 14  1 15  CHS 16  STO 01      17  CHS 18  STO 02 19  XEQ 01 20  PI 21  RCL 00 22  * 23  ST/ 04 24  / 25  RCL 03 26  2 27  / 28  STO 03 29  X<>Y 30  RAD 31  P-R 32  RCL 03      33  RCL 04 34  P-R 35  ST- T 36  RDN 37  + 38  .5 39  ST+ Z 40  X<>Y 41  - 42  DEG 43  RTN 44  LBL 01 45  RCL 02      46  RCL 01 47  2 48  + 49  ST* Y 50  LASTX 51  + 52  STO 01 53  * 54  RCL 03 55  X^2 56  / 57  CHS 58  STO 02      59  + 60  X#Y? 61  GTO 01 62  END

( 80 bytes / SIZE 005 )

 STACK INPUTS OUTPUTS Y / C(x) X x S(x)

Examples:

10   XEQ FSC  >>>>    S(10) = 0.468169979    X<>Y    C(10) =  0.499898695    ( in 5 seconds )
4.1  XEQ FSC  >>>>   S(4.1) = 0.475798258    X<>Y    C(4.1) = 0.573695632    ( in 14 seconds )

-The series are already divergent too soon for  x = 4   but if you add     RND  X<>Y   RND   X<>Y   after line 59, you'll get:

in    FIX 9     4   XEQ "FSC"   >>>>   S(4) = 0.420515754   X<>Y   C(4) = 0.498426033   ( in 11 seconds )
in    FIX 5     3   XEQ "FSC"   >>>>   S(3) = 0.4963140       X<>Y   S(3) = 0.6057203   ( exact values are  0.4963130  and  0.6057208 to 7D )

3°) Ascending Series & Continued Fraction

-The following program uses the same series expansions as "SX" & "CX"  if  | x |  <  SQRT(PI)
-Otherwise, a complex continued fraction is employed:

C(x) + i.S(x) = ((1+i)/2) erf z   with   z = (1-i).(x/2).(pi)1/2

and   ( 1 - erf z ) exp z2 =  (pi) -1/2 ( 1/(z+0.5/(z+1/(z+1.5/(z+2/(z+ .... ))))) )

Data Registers: /
Flags: /
Subroutines: /

-Synthetic registers M N O P may of course be replaced by registers R01 R02 R03 R00  ( for instance )
-In this case, delete line 122 , replace lines 110-111 by 3 , add  CLX  STO 02  after line 93 and delete line 02.
-Line 08 is a three-byte GTO 04

 01  LBL "FRI"   02  CLA   03  STO M   04  ABS   05  PI   06  SQRT   07  X>Y?   08  GTO 04   09  DEG   10  *   11  24   12  STO N   13  CLX   14  2   15  /   16  STO O   17  ENTER^   18  LBL 01   19  X<>Y   20  CHS   21  STO Z   22  X^2   23  RCL Y   24  X^2   25  + 26  DSE N   27  X<0?   28  GTO 02   29  RCL N   30  X<>Y   31  ST+ X   32  /   33  ST* Z   34  *   35  RCL O   36  ST+ Z   37  +   38  GTO 01       39  LBL 02   40  PI   41  SQRT   42  *   43  ST/ Z   44  /   45  R-P   46  RCL M   47  X^2   48  90   49  *   50  R^ 51  -   52  X<>Y   53  CHS   54  P-R   55  1   56  +   57  STO Z   58  X<>Y   59  ST+ Z   60  -   61  2   62  ST/ Z   63  /   64  GTO 05       65  LBL 03   66  X<> P   67  PI   68  2   69  ST+ N   70  /   71  RCL M   72  X^2   73  *   74  X^2   75  * 76  RCL N   77  ENTER^   78  DSE X   79  *   80  /   81  CHS   82  STO P   83  RCL N   84  ST+ X   85  ISG X   86  CLX   87  /   88  X<>Y   89  ST+ Y   90  X#Y?   91  GTO 03       92  RTN   93  LBL 04   94  X<>Y   95  STO P   96  ENTER^   97  XEQ 03   98  STO O   99  1 100  STO N 101  RCL M 102  ABS 103  3 104  Y^X 105  PI 106  * 107  2 108  / 109  STO P 110  PI 111  INT 112  / 113  ENTER^ 114  XEQ 03     115  RCL O 116  LBL 05 117  RCL M 118  SIGN 119  ST* Y 120  ST* Z 121  RDN 122  CLA 123  END

( 178 bytes / SIZE 000 )

 STACK INPUTS OUTPUTS Y / S(x) X x C(x) L / x

Examples:

1.5  XEQ "FRI"  >>>>   C(1.5) = 0.445261176      X<>Y     S(1.5) = 0.697504959         ( in 22 seconds )
4       R/S          >>>>     C(4)  = 0.498426033      X<>Y       S(4)  = 0.420515754         ( in 19 seconds )

-Thus, "FRI" produces accurate results for all arguments.
-However, "FSC" runs faster if x is very large.

References:

[1]  Abramowitz and Stegun , "Handbook of Mathematical Functions" -  Dover Publications -  ISBN  0-486-61272-4
[2]  Press , Vetterling , Teukolsky , Flannery , "Numerical Recipes in C++" - Cambridge University Press - ISBN  0-521-75033-4