Numerical Integration: Double Exponential Formulas for the HP41
Overview
1°) Tanh-Sinh Quadrature §-1+1 f(x) dx
1-a) With M-Code Routines
SINH COSH TANH X#Y?? ( 2 programs )
1-a) Without M-Code Routine
( 2 programs )
2°) Tanh-Sinh Quadrature §ab f(x) dx
2-a) With M-Code Routines
SINH COSH TANH X#Y?? ( 2 programs )
2-b) Without M-Code Routine
( 2 programs )
3°) Sinh-Sinh Quadrature §-infinity+infinity f(x) dx
3-a) With M-Code Routines
SINH COSH X#Y??
3-b) Without M-Code Routine
4°) Exp-Sinh Quadrature §0+infinity f(x) dx
4-a) With M-Code Routines
SINH COSH X#Y??
4-b) Without M-Code Routine
-The 1st versions of these programs employ M-Code routines which are
listed in "A Few M-Code Routines for the HP-41"
-The 2nd versions avoid M-Code and calculate hyperbolic functions with
the built-in E^X and E^X-1
1°) Tanh-Sinh Quadrature I = §-1+1
f(x) dx
a) With M-Code Routines
SINH COSH TANH X#Y??
Formula: For a given "small" number h , I ~ SUMk=...-2,-1,0,1,2,... wk f(xk)
where xk = Tanh ( Sinh ( k.h ) )
( The original formulas involve a factor PI / 2 that is omitted here )
and wk = h Cosh
( k.h ) / Cosh2 ( Sinh ( k.h )
Data Registers: • R00 = Function name ( Register R00 is to be initialized before executing "TSI" )
R01 = I = R07
R03 = k
R02 = h , h/2 , h/4 , ....
R04 to R06: temp
Flags: /
Subroutine: A program that takes x
in X-register and returns f(x) in X-register
01 LBL "TSI"
02 STO 02 03 E99 04 STO 07 05 SIGN 06 STO 06 07 CLX 08 STO 03 09 XEQ IND 00 10 RCL 02 11 * 12 STO 01 |
13 GTO 01
14 LBL 00 15 2 16 ST/ 01 17 ST/ 02 18 STO 06 19 SIGN 20 CHS 21 STO 03 22 LBL 01 23 RCL 06 24 ST+ 03 |
25 RCL 02
26 RCL 03 27 * 28 SINH 29 STO 05 30 TANH 31 STO 04 32 XEQ IND 00 33 X<> 04 34 CHS 35 XEQ IND 00 36 RCL 04 |
37 +
38 RCL 02 39 ST* Y 40 RCL 03 41 * 42 COSH 43 * 44 RCL 05 45 COSH 46 X^2 47 / 48 RCL 01 |
49 +
50 STO 01 51 LASTX 52 X#Y? 53 GTO 01 54 VIEW X 55 X<> 07 56 X#Y?? 57 GTO 00 58 RCL 07 59 END |
( 87 bytes / SIZE 008 )
STACK | INPUT | OUTPUT |
X | h | I |
Example: I = §-1+1
sqrt(1-x^2) dx
-The subroutine may be
01 LBL "T"
02 X^2 03 SIGN 04 LASTX 05 - 06 SQRT 07 RTN 08 END |
"T" ASTO 00 and if you choose
h = 0.2
0.2 XEQ "TSI" >>>>
1.570796325
The HP-41 displays the successive approximations
1.570796326
---Execution time = 109s---
-The exact value is PI / 2
Notes:
-Thogh it will work in many cases, the criterion lines 52-53 is obviously
not very good:
-If you choose h = 1 and if f(-1) + f(1) = 0, the program would
stop with a wrong result
-A better - though not perfect - criterion could be:
1-Add DSE 08 GTO 02
after line 53
2-Add 3
STO 08 LBL 02 after line 22
3 or another positive integer...
-If the function f has a singularity for x = +/-1 , 1 - x will not calculated with a good precision and the program may fail.
>>> In the following variant, the HP41 uses 1 - x = [ exp
( - sinh x ) } / cosh ( sinh x ) if x > 0
Data Registers: • R00 = Function name ( Register R00 is to be initialized before executing "TSI" )
R01 = I = R07
R03 = k
R02 = h , h/2 , h/4 , ....
R04 to R09: temp
Flags: /
Subroutine: A program that takes x
in X-register ,
1 - x in Y-register ,
1 + x in Z-register and returns f(x) in X-register
01 LBL "TSI"
02 STO 02 03 E99 04 STO 07 05 SIGN 06 ENTER 07 STO 06 08 0 09 STO 03 10 XEQ IND 00 11 RCL 02 12 * 13 STO 01 14 GTO 01 15 LBL 00 |
16 2
17 ST/ 01 18 ST/ 02 19 STO 06 20 SIGN 21 CHS 22 STO 03 23 LBL 01 24 RCL 06 25 ST+ 03 26 RCL 02 27 RCL 03 28 * 29 SINH 30 STO 05 |
31 TANH
32 ENTER 33 STO 04 34 1 35 + 36 STO 08 37 RCL 05 38 CHS 39 E^X 40 RCL 05 41 COSH 42 STO 05 43 / 44 STO 09 45 R^ |
46 XEQ IND 00
47 X<> 04 48 CHS 49 RCL 08 50 RCL 09 51 X<> Z 52 XEQ IND 00 53 RCL 04 54 + 55 RCL 02 56 ST* Y 57 RCL 03 58 * 59 COSH 60 * |
61 RCL 05
62 X^2 63 / 64 RCL 01 65 + 66 STO 01 67 LASTX 68 X#Y? 69 GTO 01 70 VIEW X 71 X<> 07 72 X#Y?? 73 GTO 00 74 RCL 07 75 END |
( 104 bytes / SIZE 010 )
STACK | INPUT | OUTPUT |
X | h > 0 | I |
Example1: I = §-1+1
1 / sqrt(1-x^2) dx
-Load this subroutine in main memory
01 LBL "T"
02 RDN 03 * 04 SQRT 05 1/X 06 RTN 07 END |
"T" ASTO 00 and if you choose
h = 0.2
0.2 XEQ "TSI" >>>>
3.141592655
The HP-41 displays the successive approximations
3.141592654
---Execution time = 2m40s---
-The exact value is PI
Example2: I = §-1+1 1 / sqrt(1-x^4) dx
-Since 1 - x^4 = ( 1 - x ) ( 1 + x ) ( 1 + x^2 ) we
can load the following subroutine in main memory
01 LBL "T"
02 X^2 03 SIGN 04 LASTX 05 + 06 * 07 * 08 SQRT 09 1/X 10 RTN 11 END |
"T" ASTO 00 and if you choose
h = 0.2
0.2 XEQ "TSI" >>>>
2.622057557
The HP-41 displays the successive approximations
2.622057557
---Execution time = 2m52s---
Note:
-The criterion of lines 68-69 may be improved like with the 1st version:
1-Add DSE 08 GTO 02
after line 69
2-Add 3 STO 08 LBL
02 after line 23
b) Without M-Code Routine
-The same results may be obtained without M-Code:
1st Version:
01 LBL "TSI"
02 STO 02 03 E99 04 STO 07 05 SIGN 06 STO 06 07 CLX 08 STO 03 09 XEQ IND 00 10 RCL 02 11 * 12 STO 01 13 GTO 01 14 LBL 00 15 2 16 ST/ 01 |
17 ST/ 02
18 STO 06 19 SIGN 20 CHS 21 STO 03 22 LBL 01 23 RCL 06 24 ST+ 03 25 RCL 02 26 RCL 03 27 * 28 E^X-1 29 LASTX 30 CHS 31 E^X-1 32 - |
33 STO 05
34 E^X-1 35 STO Y 36 2 37 + 38 / 39 STO 04 40 XEQ IND 00 41 X<> 04 42 CHS 43 XEQ IND 00 44 RCL 04 45 + 46 RCL 02 47 ST* Y 48 RCL 03 |
49 *
50 E^X 51 ENTER 52 1/X 53 + 54 ST+ X 55 * 56 RCL 05 57 2 58 / 59 E^X 60 ENTER 61 1/X 62 + 63 X^2 64 / |
65 RCL 01
66 + 67 STO 01 68 LASTX 69 X#Y? 70 GTO 01 71 VIEW X 72 X<> 07 73 RND 74 X<>Y 75 RND 76 X#Y? 77 GTO 00 78 RCL 07 79 END |
( 104 bytes / SIZE 008 )
STACK | INPUT | OUTPUT |
X | h | I |
-Here, the precision is controlled by the display format
-FIX 9 could lead to unuseful loops and FIX 8 is often enough to get
the best accuracy.
-Same remark as above about the criterion of lines 69-70
2nd Version:
01 LBL "TSI"
02 STO 02 03 E99 04 STO 07 05 SIGN 06 ENTER 07 STO 06 08 0 09 STO 03 10 XEQ IND 00 11 RCL 02 12 * 13 STO 01 14 GTO 01 15 LBL 00 16 2 17 ST/ 01 18 ST/ 02 19 STO 06 20 SIGN |
21 CHS
22 STO 03 23 LBL 01 24 RCL 06 25 ST+ 03 26 RCL 02 27 RCL 03 28 * 29 E^X-1 30 LASTX 31 CHS 32 E^X-1 33 - 34 STO 05 35 2 36 / 37 X<> 05 38 E^X-1 39 STO Y 40 2 |
41 +
42 / 43 STO 04 44 RCL 05 45 CHS 46 E^X 47 RCL X 48 RCL 05 49 E^X 50 + 51 2 52 / 53 STO 05 54 / 55 STO 09 56 1 57 R^ 58 + 59 STO 08 60 X<> Z |
61 XEQ IND 00
62 X<> 04 63 CHS 64 RCL 08 65 RCL 09 66 X<> Z 67 XEQ IND 00 68 RCL 04 69 + 70 RCL 02 71 ST* Y 72 RCL 03 73 * 74 E^X 75 ENTER 76 1/X 77 + 78 * 79 RCL 05 80 X^2 |
81 ST+ X
82 / 83 RCL 01 84 + 85 STO 01 86 LASTX 87 X#Y? 88 GTO 01 89 VIEW X 90 X<> 07 91 RND 92 X<>Y 93 RND 94 X#Y? 95 GTO 00 96 RCL 07 97 END |
( 104 bytes / SIZE 008 )
STACK | INPUT | OUTPUT |
X | h > 0 | I |
-Here, the precision is also controlled by the display format
-FIX 9 could lead to unuseful loops and FIX 8 is often enough to get
the best accuracy.
-Same remark as above about the criterion of lines 87-88
2°) Tanh-Sinh Quadrature I = §ab
f(x) dx
a) With M-Code Routines
SINH COSH TANH X#Y??
-We can use the programs above with the change of arguments
x = t ( b - a ) / 2 + ( a + b ) / 2
-But your HP-41 can do the job for you.
Data Registers: • R00 = Function name ( Register R00 is to be initialized before executing "TSI2" )
R01 = I = R07
R03 = k
R08 = ( a + b ) / 2
R02 = h , h/2 , h/4 , ....
R04 to R06: temp R09 = ( b - a ) /
2
Flags: /
Subroutine: A program that takes x
in X-register and returns f(x) in X-register
01 LBL "TSI2"
02 STO 02 03 RDN 04 STO 09 05 X<>Y 06 ST- 09 07 + 08 2 09 ST/ 09 10 / 11 STO 08 12 E99 13 STO 07 14 SIGN 15 STO 06 16 CLX |
17 STO 03
18 RCL 08 19 XEQ IND 00 20 RCL 02 21 * 22 RCL 09 23 * 24 STO 01 25 GTO 01 26 LBL 00 27 2 28 ST/ 01 29 ST/ 02 30 STO 06 31 SIGN 32 CHS |
33 STO 03
34 LBL 01 35 RCL 06 36 ST+ 03 37 RCL 02 38 RCL 03 39 * 40 SINH 41 STO 05 42 TANH 43 RCL 09 44 * 45 STO 04 46 RCL 08 47 + 48 XEQ IND 00 |
49 X<> 04
50 CHS 51 RCL 08 52 + 53 XEQ IND 00 54 RCL 04 55 + 56 RCL 02 57 ST* Y 58 RCL 03 59 * 60 COSH 61 * 62 RCL 09 63 * 64 RCL 05 |
65 COSH
66 X^2 67 / 68 RCL 01 69 + 70 STO 01 71 LASTX 72 X#Y? 73 GTO 01 74 VIEW X 75 X<> 07 76 X#Y?? 77 GTO 00 78 RCL 07 79 END |
( 110 bytes / SIZE 010 )
STACK | INPUT | OUTPUT |
Z | a | / |
Y | b | / |
X | h | I |
Example: I = §-23
exp ( -x^2 ) dx
01 LBL "T"
02 X^2 03 CHS 04 E^X 05 RTN 06 END |
"T" ASTO 00 and if you choose
h = 0.2
-2 ENTER^
3 ENTER^
0.2 XEQ "TSI2" >>>>
1.768288737
The HP-41 displays the successive approximations
1.768288738
---Execution time = 123s---
Notes:
-Like in the 1st paragraph, the termination criterion of lines 72-73 may be improved:
1-Add DSE 10 GTO 02
after line 73
2-Add 3 STO 10 LBL
02 after line 34
-If the function f has a singularity for x = a and/or x
= b , x - a and/or b - x will not calculated with a good
precision and the program may fail.
>>> In the following variant, the HP41 uses 1 - x = [ exp
( - sinh x ) } / cosh ( sinh x ) if x > 0
Data Registers: • R00 = Function name ( Register R00 is to be initialized before executing "TSI2" )
R01 = I = R07
R03 = k
R10 = ( b - a ) / 2
R02 = h , h/2 , h/4 , ....
R04 to R09: temp R11 = ( a + b ) / 2
Flags: /
Subroutine: A program that takes x
in X-register ,
b - x in Y-register ,
x - a in Z-register and returns f(x) in X-register
01 LBL "TSI2"
02 STO 02 03 RDN 04 STO 10 05 X<>Y 06 ST- 10 07 + 08 2 09 ST/ 10 10 / 11 STO 11 12 E99 13 STO 07 14 SIGN 15 STO 06 16 CLX 17 STO 03 18 RCL 10 19 ENTER 20 R^ |
21 XEQ IND 00
22 RCL 02 23 * 24 RCL 10 25 * 26 STO 01 27 GTO 01 28 LBL 00 29 2 30 ST/ 01 31 ST/ 02 32 STO 06 33 SIGN 34 CHS 35 STO 03 36 LBL 01 37 RCL 06 38 ST+ 03 39 RCL 02 40 RCL 03 |
41 *
42 SINH 43 STO 05 44 TANH 45 RCL 10 46 * 47 STO 04 48 RCL 11 49 + 50 RCL 04 51 RCL 10 52 + 53 STO 08 54 RCL 05 55 CHS 56 E^X 57 RCL 05 58 COSH 59 STO 05 60 / |
61 RCL 10
62 * 63 STO 09 64 R^ 65 XEQ IND 00 66 X<> 04 67 CHS 68 RCL 11 69 + 70 RCL 08 71 RCL 09 72 X<> Z 73 XEQ IND 00 74 RCL 04 75 + 76 RCL 02 77 ST* Y 78 RCL 03 79 * 80 COSH |
81 *
82 RCL 10 83 * 84 RCL 05 85 X^2 86 / 87 RCL 01 88 + 89 STO 01 90 LASTX 91 X#Y? 92 GTO 01 93 VIEW X 94 X<> 07 95 X#Y?? 96 GTO 00 97 RCL 07 98 END |
( 130 bytes / SIZE 012 )
STACK | INPUT | OUTPUT |
Z | a | / |
Y | b | / |
X | h > 0 | I |
Example: I = §28
1 / sqrt(-x^4+20.x^3-150.x^2+500.x-544) dx = §28
1 / sqrt((8-x).(x-2).(x^2-10.x+34)) dx
-Load this subroutine in main memory
01 LBL "T"
02 STO 13 03 10 04 - 05 RCL 13 06 * 07 34 08 + 09 * 10 * 11 SQRT 12 1/X 13 RTN 14 END |
"T" ASTO 00 and if you choose
h = 0.2
2 ENTER^
8 ENTER^
0.2 XEQ "TSI2" >>>>
0.874019185
The HP-41 displays the successive approximations
0.874019185
---Execution time = 3m23s---
Note:
-The criterion of lines 68-69 may be improved like with the 1st version:
1-Add DSE 12 GTO 02
after line 92
2-Add 3 STO 12 LBL
02 after line 36
b) Without M-Code Routine
-The same results may be obtained without M-Code:
1st Version:
01 LBL "TSI2"
02 STO 02 03 RDN 04 STO 09 05 X<>Y 06 ST- 09 07 + 08 2 09 ST/ 09 10 / 11 STO 08 12 E99 13 STO 07 14 SIGN 15 STO 06 16 CLX 17 STO 03 18 RCL 08 19 XEQ IND 00 20 RCL 02 |
21 *
22 RCL 09 23 * 24 STO 01 25 GTO 01 26 LBL 00 27 2 28 ST/ 01 29 ST/ 02 30 STO 06 31 SIGN 32 CHS 33 STO 03 34 LBL 01 35 RCL 06 36 ST+ 03 37 RCL 02 38 RCL 03 39 * 40 E^X-1 |
41 LASTX
42 CHS 43 E^X-1 44 - 45 STO 05 46 E^X-1 47 STO Y 48 2 49 + 50 / 51 RCL 09 52 * 53 STO 04 54 RCL 08 55 + 56 XEQ IND 00 57 X<> 04 58 CHS 59 RCL 08 60 + |
61 XEQ IND 00
62 RCL 04 63 + 64 RCL 02 65 ST* Y 66 RCL 03 67 * 68 E^X 69 ENTER 70 1/X 71 + 72 ST+ X 73 * 74 RCL 09 75 * 76 RCL 05 77 2 78 / 79 E^X 80 ENTER |
81 1/X
82 + 83 X^2 84 / 85 RCL 01 86 + 87 STO 01 88 LASTX 89 X#Y? 90 GTO 01 91 VIEW X 92 X<> 07 93 RND 94 X<>Y 95 RND 96 X#Y? 97 GTO 00 98 RCL 07 99 END |
( 127 bytes / SIZE 010 )
STACK | INPUT | OUTPUT |
Z | a | / |
Y | b | / |
X | h | I |
-Here, the precision is controlled by the display format
-FIX 9 could lead to unuseful loops and FIX 8 is often enough to get
the best accuracy.
-Same remark as above about the criterion of lines 89-90
2nd Version:
01 LBL "TSI2"
02 STO 02 03 RDN 04 STO 10 05 X<>Y 06 ST- 10 07 + 08 2 09 ST/ 10 10 / 11 STO 11 12 E99 13 STO 07 14 SIGN 15 STO 06 16 CLX 17 STO 03 18 RCL 10 19 ENTER 20 R^ 21 XEQ IND 00 22 RCL 02 23 * 24 RCL 10 |
25 *
26 STO 01 27 GTO 01 28 LBL 00 29 2 30 ST/ 01 31 ST/ 02 32 STO 06 33 SIGN 34 CHS 35 STO 03 36 LBL 01 37 RCL 06 38 ST+ 03 39 RCL 02 40 RCL 03 41 * 42 E^X-1 43 LASTX 44 CHS 45 E^X-1 46 - 47 STO 05 48 2 |
49 /
50 X<> 05 51 E^X-1 52 STO Y 53 2 54 + 55 / 56 RCL 10 57 * 58 STO 04 59 RCL 11 60 + 61 RCL 05 62 CHS 63 E^X 64 RCL X 65 RCL 05 66 E^X 67 + 68 2 69 / 70 STO 05 71 / 72 RCL 10 |
73 *
74 STO 09 75 RCL 04 76 RCL 10 77 + 78 STO 08 79 X<> Z 80 XEQ IND 00 81 X<> 04 82 CHS 83 RCL 11 84 + 85 RCL 08 86 RCL 09 87 X<> Z 88 XEQ IND 00 89 RCL 04 90 + 91 RCL 02 92 ST* Y 93 RCL 03 94 * 95 E^X 96 ENTER |
97 1/X
98 + 99 * 100 RCL 10 101 * 102 RCL 05 103 X^2 104 ST+ X 105 / 106 RCL 01 107 + 108 STO 01 109 LASTX 110 X#Y? 111 GTO 01 112 VIEW X 113 X<> 07 114 RND 115 X<>Y 116 RND 117 X#Y? 118 GTO 00 119 RCL 07 120 END |
( 120 bytes / SIZE 012 )
STACK | INPUT | OUTPUT |
Z | a | / |
Y | b | / |
X | h > 0 | I |
-Here again, the precision is controlled by the display format
-FIX 9 could lead to unuseful loops and FIX 8 is often enough to get
the best accuracy.
-Same remark as above about the criterion of lines 110-111
3°) Sinh-Sinh Quadrature I = §-infinity+infinity
f(x) dx
a) With M-Code Routines
SINH COSH X#Y??
-Here, we use the change of variable x = Sinh ( Sinh t )
where the factor PI / 2 has again been omitted
Data Registers: • R00 = Function name ( Register R00 is to be initialized before executing "SSI" )
R01 = I = R07
R03 = k
R02 = h , h/2 , h/4 , ....
R04 to R06: temp
Flags: /
Subroutine: A program that takes x
in X-register and returns f(x) in X-register
01 LBL "SSI"
02 STO 02 03 E99 04 STO 07 05 SIGN 06 STO 06 07 CLX 08 STO 03 09 XEQ IND 00 10 RCL 02 11 * 12 STO 01 |
13 GTO 01
14 LBL 00 15 2 16 ST/ 01 17 ST/ 02 18 STO 06 19 SIGN 20 CHS 21 STO 03 22 LBL 01 23 RCL 06 24 ST+ 03 |
25 RCL 02
26 RCL 03 27 * 28 SINH 29 STO 05 30 SINH 31 STO 04 32 XEQ IND 00 33 X<> 04 34 CHS 35 XEQ IND 00 36 RCL 04 |
37 +
38 RCL 02 39 ST* Y 40 RCL 03 41 * 42 COSH 43 * 44 RCL 05 45 COSH 46 * 47 RCL 01 48 + |
49 STO 01
50 LASTX 51 X#Y? 52 GTO 01 53 VIEW X 54 X<> 07 55 X#Y?? 56 GTO 00 57 RCL 07 58 END |
( 86 bytes / SIZE 008 )
STACK | INPUT | OUTPUT |
X | h | I |
Example: Evaluate I = §-infinity+infinity
exp ( -x^2 ) dx
01 LBL "T"
02 X^2 03 CHS 04 E^X 05 RTN 06 END |
"T" ASTO 00 and if you choose
h = 0.2
0.2 XEQ "SSI" >>>>
1.772418685
The HP-41 displays the successive approximations
1.772453849
1.772453851
---Execution time = 124s---
Notes:
-The exact result is sqrt(PI)
-As usual, the criterion of lines 51-52 may be improved like this:
1-Add DSE 08 GTO 02
after line 52
2-Add 3 STO 08 LBL
02 after line 22
b) Without M-Code Routine
-Without SINH , COSH and X#Y?? it yields:
01 LBL "SSI"
02 STO 02 03 E99 04 STO 07 05 SIGN 06 STO 06 07 CLX 08 STO 03 09 XEQ IND 00 10 RCL 02 11 * 12 STO 01 13 GTO 01 14 LBL 00 15 2 16 ST/ 01 |
17 ST/ 02
18 STO 06 19 SIGN 20 CHS 21 STO 03 22 LBL 01 23 RCL 06 24 ST+ 03 25 RCL 02 26 RCL 03 27 * 28 E^X-1 29 LASTX 30 CHS 31 E^X-1 32 - |
33 2
34 / 35 STO 05 36 E^X-1 37 LASTX 38 CHS 39 E^X-1 40 - 41 2 42 / 43 STO 04 44 XEQ IND 00 45 X<> 04 46 CHS 47 XEQ IND 00 48 RCL 04 |
49 +
50 RCL 02 51 ST* Y 52 RCL 03 53 * 54 E^X 55 ENTER 56 1/X 57 + 58 * 59 RCL 05 60 E^X 61 ENTER 62 1/X 63 + 64 * |
65 4
66 / 67 RCL 01 68 + 69 STO 01 70 LASTX 71 X#Y? 72 GTO 01 73 VIEW X 74 X<> 07 75 RND 76 X<>Y 77 RND 78 X#Y? 79 GTO 00 80 RCL 07 81 END |
( 104 bytes / SIZE 008 )
STACK | INPUT | OUTPUT |
X | h | I |
-Here, the precision is controlled by the display format
-FIX 9 could lead to unuseful loops and FIX 8 is often enough to get
the best accuracy.
-Same remarks as above about the criterion of lines 71-72
4°) Exp-Sinh Quadrature I = §0+infinity
f(x) dx
a) With M-Code Routines
SINH COSH X#Y??
-The change of variable is now: x = Exp ( Sinh t )
where the factor PI / 2 is again omitted
Data Registers: • R00 = Function name ( Register R00 is to be initialized before executing "ESI" )
R01 = I = R07
R03 = k
R02 = h , h/2 , h/4 , ....
R04 to R06: temp
Flags: /
Subroutine: A program that takes x
in X-register and returns f(x) in X-register
01 LBL "ESI"
02 STO 02 03 E99 04 STO 07 05 CLX 06 STO 03 07 SIGN 08 STO 06 09 XEQ IND 00 10 RCL 02 11 * 12 STO 01 |
13 GTO 01
14 LBL 00 15 2 16 ST/ 01 17 ST/ 02 18 STO 06 19 SIGN 20 CHS 21 STO 03 22 LBL 01 23 RCL 06 24 ST+ 03 |
25 RCL 02
26 RCL 03 27 * 28 SINH 29 E^X 30 STO 04 31 STO 05 32 XEQ IND 00 33 X<> 04 34 1/X 35 XEQ IND 00 36 RCL 05 |
37 /
38 RCL 04 39 RCL 05 40 * 41 + 42 RCL 02 43 ST* Y 44 RCL 03 45 * 46 COSH 47 * 48 RCL 01 |
49 +
50 STO 01 51 LASTX 52 X#Y? 53 GTO 01 54 VIEW X 55 X<> 07 56 X#Y?? 57 GTO 00 58 RCL 07 59 END |
( 85 bytes / SIZE 008 )
STACK | INPUT | OUTPUT |
X | h | I |
Example: Evaluate I = §0+infinity
exp ( -x^2 ) dx
01 LBL "T"
02 X^2 03 CHS 04 E^X 05 RTN 06 END |
"T" ASTO 00 and if you choose
h = 0.2
0.2 XEQ "ESI" >>>>
0.886226890
The HP-41 displays the successive approximations
0.886226926
0.886226926
---Execution time = 3m48s---
Notes:
-The exact result is sqrt(PI) / 2
-As usual, the criterion of lines 52-53 may be improved like this:
1-Add DSE 08 GTO 02
after line 53
2-Add 3 STO 08 LBL
02 after line 22
b) Without M-Code Routine
-If you want to avoid M-Code:
01 LBL "ESI"
02 STO 02 03 E99 04 STO 07 05 CLX 06 STO 03 07 SIGN 08 STO 06 09 XEQ IND 00 10 RCL 02 11 * 12 STO 01 13 GTO 01 14 LBL 00 15 2 |
16 ST/ 01
17 ST/ 02 18 STO 06 19 SIGN 20 CHS 21 STO 03 22 LBL 01 23 RCL 06 24 ST+ 03 25 RCL 02 26 RCL 03 27 * 28 E^X-1 29 LASTX 30 CHS |
31 E^X-1
32 - 33 2 34 / 35 E^X 36 STO 04 37 STO 05 38 XEQ IND 00 39 X<> 04 40 1/X 41 XEQ IND 00 42 RCL 05 43 / 44 RCL 04 45 RCL 05 |
46 *
47 + 48 RCL 02 49 ST* Y 50 RCL 03 51 * 52 E^X 53 ENTER 54 1/X 55 + 56 * 57 2 58 / 59 RCL 01 60 + |
61 STO 01
62 LASTX 63 X#Y? 64 GTO 01 65 VIEW X 66 X<> 07 67 RND 68 X<>Y 69 RND 70 X#Y? 71 GTO 00 72 RCL 07 73 END |
( 96 bytes / SIZE 008 )
STACK | INPUT | OUTPUT |
X | h | I |
-Here, the precision is controlled by the display format
-FIX 9 could lead to unuseful loops and FIX 8 is often enough to get
the best accuracy.
-Same remarks as above about the criterion of lines 63-64
References:
[1] Hidetosi TAKAHASI and Masatake MORI - "Double Exponential
Formulas for Numerical Integration"
[2] David H. Bailey - "Tanh-Sinh High-Precision Quadrature"