Runge-Kutta-Nystrom Methods for the HP-41
Overview
1°) A 4th-Order Method
a) Second-order differential equations
b) Systems of 2 second-order differential
equations
c) Systems of 3 second-order differential
equations
2°) A Runge-Kutta-Nystrom Method with order 6
a) Second order differential equations
b) Systems of 2 second-order differential
equations
3°) S-Stage Explicit Runge-Kutta-Nystrom formulae
a) Second order differential equations
b) Systems of 2 second-order differential
equations
-A differential equation of the type y" = f(x,y) may always be replaced by a system of 2 first order equations:
y' = z
z' = f(x,y)
-However, the same order of accuracy may be obtained with less evaluations of the function if we use formulae specially devised for these problems.
3 evaluations instead of 4 for
a 4th-order method
5 evaluations instead of 7 for
a 6th-order method
13 evaluations instead of 17 for a 10th-order method ...
etc ...
Notes:
-The programs of paragraph 1 are already listed elsewhere in this website
( cf "Explicit Runge-Kutta Methods" & "Systems of Differential
Equations" )
-They are just included here for the sake of consistency.
1°) A 4th-Order Method
a) Second-order differential
Equations
-Here, we have to solve: y" = f(x,y) with the initial values: y(x0) = y0 y'(x0) = y'0
-This program uses the 4th-order Runge-Kutta formula:
y(x+h) = y(x) + h ( y'(x) + k1/6 + 2k2/3
)
y'(x+h) = y'(x) + k1/6 + 2k2/3 +
k3/6
where k1 = h.f (x,y) ; k2 = h.f(x+h/2,y+h.y'/2+h.k1/8)
; k3 = h.f(x+h,y+h.y'+h.k2/2)
-Note that only 3 evaluations of the function are needed ( for each
step ).
Data Registers: • R00: subroutine name ( Registers R00 thru R05 are to be initialized before executing "RKS1" )
• R01 = x0 •
R04 = h/2 = half of the stepsize
R06 to R08: temp
• R02 = y0 •
R05 = N = number of steps
• R03 = y'0
Flags: /
Subroutine: a program which calculates f(x,y)
in X-register, assuming x and y are in registers X and Y upon
entry.
01 LBL "RKS1"
02 RCL 05 03 STO 08 04 LBL 01 05 RCL 02 06 RCL 01 07 XEQ IND 00 08 RCL 04 09 ST+ 01 10 * 11 STO 06 12 2 |
13 /
14 RCL 03 15 + 16 RCL 04 17 * 18 RCL 02 19 + 20 RCL 01 21 XEQ IND 00 22 RCL 04 23 ST+ 01 24 * |
25 STO 07
26 RCL 03 27 + 28 RCL 04 29 ST+ X 30 * 31 RCL 02 32 + 33 RCL 01 34 XEQ IND 00 35 RCL 04 36 * |
37 RCL 06
38 + 39 RCL 07 40 ST+ X 41 ST+ 06 42 ST+ X 43 + 44 3 45 ST/ 06 46 / 47 X<> 03 48 ST+ 03 |
49 RCL 06
50 + 51 RCL 04 52 ST+ X 53 * 54 ST+ 02 55 DSE 08 56 GTO 01 57 RCL 03 58 RCL 02 59 RCL 01 60 END |
( 85 bytes / SIZE 009 )
STACK | INPUTS | OUTPUTS |
Z | / | y'(x0+N.h) |
Y | / | y(x0+N.h) |
X | / | x0+N.h |
Example: y(0) = 1 ,
y'(0) = 1 , y" = - y ( x2 + y2
) 1/2
>>> Calculate y(1) & y'(1)
-Load this short routine:
01 LBL "T"
02 X^2 03 X<>Y 04 STO Z 05 X^2 06 + 07 SQRT 08 * 09 CHS 10 RTN |
"T" ASTO 00
0 STO 01 STO 03 1 STO 02
-With h = 0.1 and N = 10 , 0.05 STO 04 10 STO 05
XEQ "RKS1" >>>> x
= 1
---Execution time = 29s---
RDN y(1) = 0.536630911
RDN y'(1) = -0.860172085
-With h = 0.02 & N = 50 , it yields
y(1) = 0.536630617
y'(1) = -0.860171928
Note:
-Simply press R/S to continue with the same h &N
b) Systems of 2 Second-order
differential Equations
-"RKS2" solves the system:
y" = f(x,y,z)
y(x0) = y0 y'(x0)
= y'0
z" = g(x,y,z)
z(x0) = z0 z'(x0)
= z'0
Data Registers: • R00: subroutine name ( Registers R00 thru R07 are to be initialized before executing "RKS2" )
• R01 = x0 •
R04 = h/2 = half of the stepsize •
R06 = y'0
R08 to R12: temp
• R02 = y0 •
R05 = N = number of steps
• R07 = z'0
• R03 = z0
Flags: /
Subroutine: a program which calculates f(x;y;z)
in Y-register and g(x;y;z) in X-register
assuming x is in X-register , y is in Y-register and z is in Z-register
upon entry.
-Line 96 is a three-byte GTO 01
01 LBL "RKS2"
02 RCL 05 03 STO 12 04 LBL 01 05 RCL 03 06 RCL 02 07 RCL 01 08 XEQ IND 00 09 RCL 04 10 ST+ 01 11 ST* Z 12 * 13 STO 09 14 2 15 / 16 RCL 07 17 + 18 RCL 04 19 * 20 RCL 03 |
21 +
22 X<>Y 23 STO 08 24 2 25 / 26 RCL 06 27 + 28 RCL 04 29 * 30 RCL 02 31 + 32 RCL 01 33 XEQ IND 00 34 RCL 04 35 ST+ 01 36 ST* Z 37 * 38 STO 11 39 RCL 07 40 + |
41 X<>Y
42 STO 10 43 RCL 06 44 + 45 RCL 04 46 ST+ X 47 ST* Z 48 * 49 RCL 03 50 ST+ Z 51 CLX 52 RCL 02 53 + 54 RCL 01 55 XEQ IND 00 56 RCL 04 57 ST* Z 58 * 59 RCL 09 60 + |
61 RCL 11
62 ST+ X 63 ST+ 09 64 ST+ X 65 + 66 3 67 ST/ 09 68 / 69 X<> 07 70 ST+ 07 71 RCL 09 72 + 73 X<>Y 74 RCL 08 75 + 76 RCL 10 77 ST+ X 78 ST+ 08 79 ST+ X 80 + |
81 3
82 ST/ 08 83 / 84 X<> 06 85 ST+ 06 86 RCL 08 87 + 88 RCL 04 89 ST+ X 90 ST* Z 91 * 92 ST+ 02 93 X<>Y 94 ST+ 03 95 DSE 12 96 GTO 01 97 RCL 03 98 RCL 02 99 RCL 01 100 END |
( 139 bytes / SIZE 013 )
STACK | INPUTS | OUTPUTS |
Z | / | z(x0+N.h) |
Y | / | y(x0+N.h) |
X | / | x0+N.h |
Example:
d2y/dx2 = -y.z
y(0) = 2 y'(0) = 1
Evaluate y(1) , z(1) , y'(1) , z'(1) with
h = 0.1 & N = 10
d2z/dx2 = x.(
y + z ) z(0) = 1
z'(0) = 1
01 LBL "T"
02 RDN 03 STO Z 04 X<>Y 05 CHS 06 ST* Z 07 - 08 R^ 09 * 10 RTN |
"T" ASTO 00
0 STO 01
1 STO 06
2 STO 02
1 STO 07
1 STO 03
0.05 STO 04
10 STO 05
XEQ "RKS2" >>>> x =
1
( in 41 seconds )
RDN y(1) = 1.531358015 and
R06 = y'(1) = -2.312838895
RDN z(1) = 2.620254480
R07 = z'(1) = 2.941751649
-With h = 0.05 it yields y(1) =
1.531356736 y'(1) = -2.312840085
z(1) = 2.620254295 z'(1) =
2.941748608
-Actually, the exact results - rounded to 9D - are
y(1) = 1.531356646
y'(1) = -2.312840137
z(1) = 2.620254281
z'(1) = 2.941748399
-To continue the calculations, simply press R/S ( after changing
h/2 & N in registers R04 & R05 if needed )
c) Systems of 3 Second-order
differential Equations
-"RKS3" solves the system:
y" = f(x,y,z,u)
y(x0) = y0 y'(x0)
= y'0
z" = g(x,y,z,u)
z(x0) = z0 z'(x0)
= z'0
u" = h(x,y,z,u)
u(x0) = u0 u'(x0)
= u'0
Data Registers: • R00: subroutine name ( Registers R00 thru R09 are to be initialized before executing "RKS3" )
• R01 = x0 •
R05 = h/2 = half of the stepsize •
R07 = y'0
• R02 = y0 •
R06 = N = number of steps
• R08 = z'0
• R03 = z0
R10 to R16: temp
• R09 = u'0
• R04 = u0
Flags: /
Subroutine: a program which calculates f(x;y;z;u)
in Z-register , g(x;y;z;u) in Y-register and h(x;y;z;u) in X-register
assuming x is in X-register , y is in Y-register , z is in Z-register and
u is in T-register upon entry.
-Line 136 is a three-byte GTO 01
01 LBL "RKS3"
02 RCL 06 03 STO 16 04 LBL 01 05 RCL 04 06 RCL 03 07 RCL 02 08 RCL 01 09 XEQ IND 00 10 RCL 05 11 ST+ 01 12 ST* Z 13 ST* T 14 * 15 STO 12 16 2 17 / 18 RCL 09 19 + 20 RCL 05 21 * 22 RCL 04 23 + 24 X<>Y 25 STO 11 26 2 27 / 28 RCL 08 29 + |
30 RCL 05
31 * 32 RCL 03 33 + 34 R^ 35 STO 10 36 2 37 / 38 RCL 07 39 + 40 RCL 05 41 * 42 RCL 02 43 + 44 RCL 01 45 XEQ IND 00 46 RCL 05 47 ST+ 01 48 ST* Z 49 ST* T 50 * 51 STO 15 52 RCL 09 53 + 54 X<>Y 55 STO 14 56 RCL 08 57 + 58 R^ |
59 STO 13
60 RCL 07 61 + 62 RCL 05 63 ST+ X 64 ST* Z 65 ST* T 66 * 67 RCL 04 68 ST+ T 69 CLX 70 RCL 03 71 ST+ Z 72 CLX 73 RCL 02 74 + 75 RCL 01 76 XEQ IND 00 77 RCL 05 78 ST* Z 79 ST* T 80 * 81 RCL 12 82 + 83 RCL 15 84 ST+ X 85 ST+ 12 86 ST+ X 87 + |
88 3
89 ST/ 12 90 / 91 X<> 09 92 ST+ 09 93 RCL 12 94 + 95 X<>Y 96 RCL 11 97 + 98 RCL 14 99 ST+ X 100 ST+ 11 101 ST+ X 102 + 103 3 104 ST/ 11 105 / 106 X<> 08 107 ST+ 08 108 RCL 11 109 + 110 R^ 111 RCL 10 112 + 113 RCL 13 114 ST+ X 115 ST+ 10 116 ST+ X |
117 +
118 3 119 ST/ 10 120 / 121 X<> 07 122 ST+ 07 123 RCL 10 124 + 125 RCL 05 126 ST+ X 127 ST* Z 128 ST* T 129 * 130 ST+ 02 131 X<>Y 132 ST+ 03 133 R^ 134 ST+ 04 135 DSE 16 136 GTO 01 137 RCL 04 138 RCL 03 139 RCL 02 140 RCL 01 141 END |
( 194 bytes / SIZE 017 )
STACK | INPUTS | OUTPUTS |
T | / | u(x0+N.h) |
Z | / | z(x0+N.h) |
Y | / | y(x0+N.h) |
X | / | x0+N.h |
Example:
d2y/dx2 = -y.z.u
y(0) = 1 y'(0) = 1
Evaluate y(1) , z(1) , u(1) , y'(1) , z'(1) , u'(1)
with h = 0.1 & N = 10
d2z/dx2 = x.( y + z
- u ) z(0) = 1
z'(0) = 1
d2u/dx2 = x.y - z.u
u(0) = 2 u'(0) = 1
LBL "T" R^
RCL Z X<> Z
LASTX
"T" ASTO 00
R^
ST* Y R^
ST+ Y *
CHS
ST+ L ST+ L
ST* Z X<>Y
STO L CLX
ST* Y X<> T
RTN
0 STO 01
1 STO 02 STO 03 STO 07
STO 08 STO 09
2 STO 04
0.05 STO 05
10 STO 06 XEQ "RKS3"
>>>> x = 1
( in 65 seconds )
RDN y(1) = 0.439528419
y'(1) = -2.101120400 = R07
RDN z(1) = 2.070938499
z'(1) = 1.269599239 = R08
RDN u(1) = 1.744522976
u'(1) = -1.704232092 = R09
-With h = 0.05 it yields
y(1) = 0.439524393
y'(1) = -2.101122784
z(1) = 2.070940521
z'(1) = 1.269597110
u(1) = 1.744524843
u'(1) = -1.704234567
-Actually, the exact results rounded to 9D are:
y(1) = 0.439524100
y'(1) = -2.101122880
z(1) = 2.070940654
z'(1) = 1.269596950
u(1) = 1.744524964
u'(1) = -1.704234756
-Press R/S to continue the calculations ( after changing h &
N in registers R05 & R06 if needed )
2°) A Runge-Kutta-Nystrom Method with order
6
a) Second-order differential
Equations
-Five stages are sufficient to get a 6-th order formula.
-The following one is due to Albrecht:
f0 = f(x0,y0)
f1 = f(x0+ h/4 , y0+
(h/4) y'0+ (h2/32) f0)
f2 = f(x0+ h/2 , y0+
(h/2) y'0+ h2 (-f0/24 + f1/6
)
f3 = f(x0+ 3h/4 , y0+
(3h/4) y'0+ h2 (3f0/32 + f1/8
+ f2/16 )
f4 = f(x0+ h , y0+ h
y'0+ h2 (3f1/7 - f2/14 + f3/7
)
-Then, y = y0 + h y'0+ h2
( 7 f0/90 + 4 f1/15 + f2/15 + 4 f3/45
) + O(h7)
and y' = y'0 + h (
7 f0/90 + 16 f1/45 + 2 f2/15 + 16 f3/45
+ 7 f4/90 ) + O(h7)
Data Registers: • R00: subroutine name ( Registers R00 thru R05 are to be initialized before executing "RKN6" )
• R01 = x0 •
R04 = h = stepsize R06
to R10: temp
• R02 = y0 •
R05 = N = number of steps
• R03 = y'0
Flags: /
Subroutine: a program which calculates f(x,y)
in X-register, assuming x and y are in registers X and Y upon
entry.
-Line 144 is a three-byte GTO 01
01 LBL "RKN6"
02 RCL 05 03 STO 10 04 LBL 01 05 RCL 02 06 RCL 01 07 XEQ IND 00 08 RCL 04 09 * 10 STO 06 11 8 12 / 13 RCL 03 14 + 15 RCL 04 16 * 17 4 18 / 19 RCL 02 20 + 21 RCL 04 22 4 23 / 24 RCL 01 25 + 26 XEQ IND 00 27 RCL 04 28 * 29 STO 07 30 6 |
31 /
32 RCL 06 33 24 34 / 35 - 36 RCL 03 37 2 38 / 39 + 40 RCL 04 41 * 42 RCL 02 43 + 44 RCL 04 45 2 46 / 47 RCL 01 48 + 49 XEQ IND 00 50 RCL 04 51 * 52 STO 08 53 ST+ X 54 RCL 07 55 4 56 * 57 + 58 RCL 06 59 3 60 * |
61 +
62 8 63 / 64 RCL 03 65 3 66 * 67 + 68 RCL 04 69 * 70 4 71 / 72 RCL 02 73 + 74 RCL 04 75 .75 76 * 77 RCL 01 78 + 79 XEQ IND 00 80 RCL 04 81 * 82 STO 09 83 ST+ X 84 RCL 08 85 - 86 RCL 07 87 6 88 * 89 + 90 14 |
91 /
92 RCL 03 93 + 94 RCL 04 95 ST+ 01 96 * 97 RCL 02 98 + 99 RCL 01 100 XEQ IND 00 101 RCL 04 102 * 103 RCL 06 104 + 105 7 106 * 107 RCL 07 108 RCL 09 109 + 110 32 111 * 112 + 113 RCL 08 114 12 115 * 116 + 117 RCL 09 118 8 119 * 120 RCL 08 |
121 6
122 * 123 + 124 RCL 07 125 24 126 * 127 + 128 RCL 06 129 7 130 * 131 + 132 90 133 ST/ Z 134 / 135 RCL 03 136 + 137 RCL 04 138 * 139 ST+ 02 140 X<>Y 141 ST+ 03 142 DSE 10 143 GTO 01 144 RCL 03 145 RCL 02 146 RCL 01 147 END |
( 178 bytes / SIZE 011 )
STACK | INPUTS | OUTPUTS |
Z | / | y'(x0+N.h) |
Y | / | y(x0+N.h) |
X | / | x0+N.h |
Example: y(0) = 1 ,
y'(0) = 1 , y" = - y ( x2 + y2
) 1/2
>>> Calculate y(1) & y'(1)
-Load this short routine:
01 LBL "T"
02 X^2 03 X<>Y 04 STO Z 05 X^2 06 + 07 SQRT 08 * 09 CHS 10 RTN |
"T" ASTO 00
0 STO 01 STO 03 1 STO 02
-With h = 0.1 and N = 10 , 0.1 STO 04 10 STO 05
XEQ "RKN6" >>>> x
= 1
---Execution time = 76s---
RDN y(1) = 0.536630617
RDN y'(1) = -0.860171927
-The exact results, rounded to 10D are y(1) = 0.5366306164 & y'(1) = -0.8601719268
Note:
-Press R/S to continue the calculations ( after changing h &
N in registers R04 & R05 if need be )
b) Systems of 2 Second-order
differential Equations
-"RKN6B" solves the system:
y" = f(x,y,z)
y(x0) = y0 y'(x0)
= y'0
z" = g(x,y,z)
z(x0) = z0 z'(x0)
= z'0
Data Registers: • R00: subroutine name ( Registers R00 thru R07 are to be initialized before executing "RKN6B" )
• R01 = x0 •
R04 = h = stepsize
• R06 = y'0
R08 to R16: temp
• R02 = y0 •
R05 = N = number of steps
• R07 = z'0
• R03 = z0
Flags: /
Subroutine: a program which calculates f(x;y;z)
in Y-register and g(x;y;z) in X-register
assuming x is in X-register , y is in Y-register and z is in Z-register
upon entry.
-Line 255 is a three-byte GTO 01 ( or replace it by GTO
16 and line 04 by LNL 16 )
01 LBL "RKN6B"
02 RCL 05 03 STO 16 04 LBL 01 05 RCL 03 06 RCL 02 07 RCL 01 08 XEQ IND 00 09 RCL 04 10 ST* Z 11 * 12 STO 12 13 8 14 / 15 RCL 07 16 + 17 4 18 / 19 RCL 04 20 * 21 RCL 03 22 + 23 X<>Y 24 STO 08 25 8 26 / 27 RCL 06 28 + 29 4 30 / 31 RCL 04 32 * 33 RCL 02 34 + 35 RCL 04 36 4 37 / 38 RCL 01 39 + 40 XEQ IND 00 41 RCL 04 42 ST* Z 43 * 44 STO 13 |
45 6
46 / 47 RCL 12 48 24 49 / 50 - 51 RCL 07 52 2 53 / 54 + 55 RCL 04 56 * 57 RCL 03 58 + 59 X<>Y 60 STO 09 61 6 62 / 63 RCL 08 64 24 65 / 66 - 67 RCL 06 68 2 69 / 70 + 71 RCL 04 72 * 73 RCL 02 74 + 75 RCL 04 76 2 77 / 78 RCL 01 79 + 80 XEQ IND 00 81 RCL 04 82 ST* Z 83 * 84 STO 14 85 ST+ X 86 RCL 13 87 4 88 * |
89 +
90 RCL 12 91 3 92 * 93 + 94 32 95 / 96 RCL 07 97 .75 98 STO 15 99 * 100 + 101 RCL 04 102 * 103 RCL 03 104 + 105 X<>Y 106 STO 10 107 ST+ X 108 RCL 09 109 4 110 * 111 + 112 RCL 08 113 3 114 * 115 + 116 32 117 / 118 RCL 06 119 RCL 15 120 * 121 + 122 RCL 04 123 * 124 RCL 02 125 + 126 RCL 04 127 RCL 15 128 * 129 RCL 01 130 + 131 XEQ IND 00 132 RCL 04 |
133 ST* Z
134 * 135 STO 15 136 ST+ X 137 RCL 14 138 - 139 RCL 13 140 6 141 * 142 + 143 14 144 / 145 RCL 07 146 + 147 RCL 04 148 * 149 RCL 03 150 + 151 X<>Y 152 STO 11 153 ST+ X 154 RCL 10 155 - 156 RCL 09 157 6 158 * 159 + 160 14 161 / 162 RCL 06 163 + 164 RCL 04 165 ST+ 01 166 * 167 RCL 02 168 + 169 RCL 01 170 XEQ IND 00 171 RCL 04 172 ST* Z 173 * 174 RCL 12 175 + 176 7 |
177 *
178 RCL 13 179 RCL 15 180 + 181 32 182 * 183 + 184 RCL 14 185 12 186 * 187 + 188 X<>Y 189 RCL 08 190 + 191 7 192 * 193 RCL 09 194 RCL 11 195 + 196 32 197 * 198 + 199 RCL 10 200 12 201 * 202 + 203 X<> 11 204 8 205 * 206 RCL 10 207 6 208 * 209 + 210 RCL 09 211 24 212 * 213 + 214 RCL 08 215 7 216 * 217 + 218 90 219 ST/ Z 220 ST/ 11 |
221 /
222 RCL 06 223 + 224 RCL 04 225 * 226 ST+ 02 227 X<> 11 228 ST+ 06 229 X<>Y 230 X<> 15 231 8 232 * 233 RCL 14 234 6 235 * 236 + 237 RCL 13 238 24 239 * 240 + 241 RCL 12 242 7 243 * 244 + 245 90 246 / 247 RCL 07 248 + 249 RCL 04 250 * 251 ST+ 03 252 X<> 15 253 ST+ 07 254 DSE 16 255 GTO 01 256 RCL 03 257 RCL 02 258 RCL 01 259 END |
( 314 bytes / SIZE
017 )
STACK | INPUTS | OUTPUTS |
Z | / | z(x0+N.h) |
Y | / | y(x0+N.h) |
X | / | x0+N.h |
Example:
d2y/dx2 = -y.z
y(0) = 2 y'(0) = 1
Evaluate y(1) , z(1) , y'(1) , z'(1) with
h = 0.1 & N = 10
d2z/dx2 = x.(
y + z ) z(0) = 1
z'(0) = 1
01 LBL "T"
02 RDN 03 STO Z 04 X<>Y 05 CHS 06 ST* Z 07 - 08 R^ 09 * 10 RTN |
"T" ASTO 00
0 STO 01
1 STO 06
2 STO 02
1 STO 07
1 STO 03
0.1 STO 04
10 STO 05
XEQ "RKN6B" >>>> x =
1
---Execution time = 116s---
RDN y(1) = 1.531356647 and
R06 = y'(1) = -2.312840139
RDN z(1) = 2.620254282
R07 = z'(1) = 2.941748401
-The precision is almost perfect, since the exact results - rounded to 9D - are
y(1) = 1.531356646
y'(1) = -2.312840137
z(1) = 2.620254281
z'(1) = 2.941748399
-To continue the calculations, simply press R/S ( after changing
h & N in registers R04 & R05 if need be )
3°) S-Stage Explicit Runge-Kutta-Nystrom formulae
a) Second-order differential
Equations
-All s-stage explicit Runge-Kutta-Nystrom formulae without error estimate are determined by ( s2 + 5.s - 2 ) / 2 coefficients ai,j ; bi ; ci
k1 = h.f(x;y)
k2 = h.f(x+c2.h;y+c2.h.y'+h
a2,1.k1)
k3 = h.f(x+c3.h;y+c3.h.y'+h(a3,1.k1+a3,2.k2)
)
.................................................................................
ks = h.f(x+cs.h;y+cs.h.y'+h (as,1.k1+as,2.k2+ .......... +as,s-1.ks-1) )
then, y(x+h) = y(x) + h y'(x) + h [ b1.k1+ ................ + bs.ks ] and y'(x+h) = y'(x) + [ b'1.k1+ ................ + b's.ks ]
-Therefore, a single program may be used for all explicit Runge-Kutta-Nystrom
methods,
provided the coefficients are stored in appropriate registers.
Data Registers: • R00: f name ( Registers R00 to R06 and Rs+10 to R(s2+7.s+16)/2 are to be initialized before executing "ERKN" )
• R01 = x0
R07 to R09: temp
• Rs+10 to R(s2+7.s+16)/2 = the ( s2
+ 5.s - 2 ) / 2 coefficients ai,j ; bi ; ci
• R02 = y0
R10 = k1
which are to be stored as shown below:
• R03 = y'0
R11 = k2
• R04 = h = stepsize
............
• R05 = N = number of steps
• R06 = s = number of stages
Rs+9 = ks
• Rs+10 = a2,1
• Rs+11 = c2
• Rs+12 = a3,1
• Rs+13 = a3,2
• Rs+14 = c3
......................................................................... ...................
• R(s2+s+18)/2 = as,1 ................ • R(s2+3s+14)/2 = as,s-1 • R(s2+3s+16)/2 = cs
• R(s2+3s+18)/2 = b1 ............................................................
• R(s2+5s+16)/2 = bs
• R(s2+5s+18)/2 = b'1 ...........................................................
• R(s2+7s+16)/2 = b's
Flags: /
Subroutine: a program calculating f(x;y)
assuming x is in X-register and y is in Y-register upon entry.
-Line 97 is a three-byte GTO 01
01 LBL "ERKN"
02 RCL 05 03 STO 07 04 LBL 01 05 10 06 STO 08 07 3 08 RCL 06 09 ST+ Y 10 * 11 2 12 / 13 8 14 + 15 E3 16 / 17 + 18 RCL 06 19 + 20 STO 09 21 RCL 02 |
22 RCL 01
23 XEQ IND 00 24 RCL 04 25 * 26 STO 10 27 LBL 02 28 RCL 08 29 INT 30 E3 31 / 32 10 33 + 34 STO 08 35 CLX 36 LBL 03 37 RCL IND 08 38 RCL IND 09 39 * 40 + 41 ISG 09 42 ISG 08 |
43 GTO 03
44 RCL 03 45 RCL IND 09 46 * 47 + 48 RCL 04 49 * 50 RCL 02 51 + 52 RCL 04 53 RCL IND 09 54 * 55 RCL 01 56 + 57 XEQ IND 00 58 RCL 04 59 * 60 STO IND 08 61 ISG 09 62 GTO 02 63 RCL 06 |
64 1.001
65 - 66 ST- 08 67 CLX 68 LBL 04 69 RCL IND 08 70 RCL IND 09 71 * 72 + 73 ISG 09 74 CLX 75 ISG 08 76 GTO 04 77 RCL 03 78 + 79 RCL 04 80 ST+ 01 81 * 82 ST+ 02 83 RCL 06 84 ST- 08 |
85 CLX
86 LBL 05 87 RCL IND 08 88 RCL IND 09 89 * 90 + 91 ISG 09 92 CLX 93 ISG 08 94 GTO 05 95 ST+ 03 96 DSE 07 97 GTO 01 98 RCL 03 99 RCL 02 100 RCL 01 101 END |
( 149 bytes
/ SIZE ( s^2+7.s+18 )/2 )
STACK | INPUTS | OUTPUTS |
Z | / | y'(x0+N.h) |
Y | / | y(x0+N.h) |
X | / | x0+N.h |
Example: y(0) = 1 ,
y'(0) = 1 , y" = - y ( x2 + y2
) 1/2
>>> Calculate y(1) & y'(1)
-Load this routine:
01 LBL "T"
02 X^2 03 X<>Y 04 STO Z 05 X^2 06 + 07 SQRT 08 * 09 CHS 10 RTN |
"T" ASTO 00
0 STO 01 STO 03 1 STO 02
-With h = 0.1 and N = 10 , 0.1 STO 04 10 STO 05
-If we use the same ( Albrecht ) 5-stage method, store the following coefficients into R15 thru R38
1/32
1/4
R15
R16
-1/24 1/6
1/2
R17 R18
R19
3/32 1/8 1/16
3/4 =
R20 R21 R22
R23
0
3/7 -1/14 1/7 1
R24 R25 R26 R27 R28
7/90 4/15 1/15 4/45
0
R29 R30 R31 R32 R33
7/90 16/45 2/15 16/45 7/90
R34 R35 R36 R37 R38
-Since it is a 5-stage method, 5 STO 06
and
XEQ "ERKN" >>>> x
= 1
---Execution time = 147s---
RDN y(1) = 0.536630617
RDN y'(1) = -0.860171927
Notes:
-Press R/S to continue the calculations ( after changing h &
N in registers R04 & R05 if need be )
-LBL 04 & LBL 05 are identical, so they could form a subroutine:
-The program would be shorter but slower.
Control Number of the Array of Coefficients for an S-stage method:
S | bbb.eee |
5
6 7 8 9 10 11 12 13 14 15 16 17 |
15.038
16.047 17.057 18.068 19.080 20.093 21.107 22.122 23.138 24.155 25.173 26.192 27.212 |
-For instance, we can use the coefficients below - taken from reference
[3] - to get a 13-stage 10th-order method.
-These 116 coefficients are to be stored into R23 thru R138 in the
following order:
a( 2, 1) = 6.2550354381669436926370260206784041201048E-04
= R23
c( 2) = 3.5369578561715839852580662156128003290245E-02
a( 3, 1) = 8.3400472508892582568493680275712054934730E-04
a( 3, 2) = 1.6680094501778516513698736055142410986946E-03
c( 3) = 7.0739157123431679705161324312256006580491E-02
a( 4, 1) = 1.4377592173651130455265029764307572975032E-02
a( 4, 2) = -2.5520389586889438033660194426507730127969E-02
a( 4, 3) = 2.9955419091121746433503478890580675956400E-02
c( 4) = 1.9397227470895648005755022968171580307125E-01
a( 5, 1) = 5.6606010103291956408355747332339448084576E-03
a( 5, 2) = 0.0000000000000000000000000000000000000000E+00
a( 5, 3) = 2.2438147205568485440414320313187753497836E-02
a( 5, 4) = 9.6198950134107937593128496677833016937067E-03
c( 5) = 2.7465849059990290000000000000000000000000E-01
a( 6, 1) = 4.2497841145700712790685880544080818730288E-03
a( 6, 2) = 0.0000000000000000000000000000000000000000E+00
a( 6, 3) = 1.3737389558120657344878988260209037684744E-02
a( 6, 4) = 2.1090823734166889521084117969028056034572E-03
a( 6, 5) = -2.1698166033104208350129690333992516122959E-04
c( 6) = 1.9939545825206940000000000000000000000000E-01
a( 7, 1) = 8.4469918165805880106087924734363680346449E-04
a( 7, 2) = 0.0000000000000000000000000000000000000000E+00
a( 7, 3) = 7.6286170426770036487508428629504122228445E-04
a( 7, 4) = -4.5274889794326362037916138257410810321144E-03
a( 7, 5) = -9.4704498758374659029865654611073300453711E-05
a( 7, 6) = 4.3839567862160003018135640613696763068192E-03
c( 7) = 5.2332097109723180000000000000000000000000E-02
a( 8, 1) = 4.0257188676144292921381323534074832686999E-02
a( 8, 2) = 0.0000000000000000000000000000000000000000E+00
a( 8, 3) = 2.8132558570671430000000000000000000000000E-01
a( 8, 4) = -9.9086973311055342850364525233745309401480E-02
a( 8, 5) = 3.1558678646031991227831775524256371039974E-02
a( 8, 6) = 7.6263009309052972315471957912384344318273E-02
a( 8, 7) = -2.4509110177537917817170493451316523864377E-01
c( 8) = 4.1285926718800690000000000000000000000000E-01
a( 9, 1) = -5.1852206149158582964016598801731374371401E-01
a( 9, 2) = 0.0000000000000000000000000000000000000000E+00
a( 9, 3) = -4.0220496748396490000000000000000000000000E+00
a( 9, 4) = 1.3339542387088720000000000000000000000000E+00
a( 9, 5) = -3.6280137620198678475540384353108923505414E-01
a( 9, 6) = -4.4662932597538443824830112336373381632573E-01
a( 9, 7) = 4.1093353899979717196794462089910810944472E+00
a( 9, 8) = 8.3371860107714029551447509208700700646694E-02
c( 9) = 5.9440567007045230000000000000000000000000E-01
a(10, 1) = 4.5526515039304022037674417630889739137541E-01
a(10, 2) = 0.0000000000000000000000000000000000000000E+00
a(10, 3) = 3.4410244296399106992261498105244921193431E+00
a(10, 4) = -1.1420304634021581044575027059094514599562E+00
a(10, 5) = 3.3122504529344460041163434350588640458224E-01
a(10, 6) = 5.2510814510725835145952044841619177157062E-01
a(10, 7) = -3.4007204966989148959577640759197726181960E+00
a(10, 8) = 1.4959025547025800806021814497275304454960E-02
a(10, 9) = 1.7714834024190792778113334621606086825758E-02
c(10) = 6.9648498893199050000000000000000000000000E-01
a(11, 1) = -5.0738859071291316865190644559724141522647E-02
a(11, 2) = 0.0000000000000000000000000000000000000000E+00
a(11, 3) = -8.5258315802766612821674340523993103859370E-01
a(11, 4) = 2.9256281989303017562028747765972648095241E-01
a(11, 5) = -4.2631304538837970000000000000000000000000E-01
a(11, 6) = 3.0845126792446679274386181736916000785280E-01
a(11, 7) = 8.2068063064681728553592877499937152955118E-01
a(11, 8) = 2.6353200561785124318114669620069412596405E-01
a(11, 9) = -3.8002959536498107924589290701514760515073E-02
a(11,10) = 5.0836949957876193531014830503462796310983E-02
c(11) = 8.5840043338316930000000000000000000000000E-01
a(12, 1) = -8.5506341904459305448936612697062868735670E-01
a(12, 2) = 0.0000000000000000000000000000000000000000E+00
a(12, 3) = -4.4172967833111218167905547111397401957735E+00
a(12, 4) = 1.4620414738250776987869127049027576880060E+00
a(12, 5) = 1.5800603670627463865955782231377536485336E+00
a(12, 6) = -2.1500473087668603894015427990085825826253E+00
a(12, 7) = 5.2192882951843358632420497699580187954903E+00
a(12, 8) = -7.0122224598841812446074882425859149461800E-01
a(12, 9) = 4.0674284722476557322266460477065027849355E-01
a(12,10) = -1.0995016400771572122089410865399735394434E-01
a(12,11) = 2.5498951087297871672803054502111066906939E-02
c(12) = 9.5922053070763063933434705195204984252787E-01
a(13, 1) = 3.6124205767243278950403294321213352485132E+00
a(13, 2) = 0.0000000000000000000000000000000000000000E+00
a(13, 3) = 1.9614376424164347318861614225759179537283E+01
a(13, 4) = -6.5540954527470471068838634201654381264077E+00
a(13, 5) = -5.3634775178894355119823336908885299369771E+00
a(13, 6) = 8.9549200633414078297191926517465420210063E+00
a(13, 7) = -2.2111999575685298066957085805778892539418E+01
a(13, 8) = 3.0666418328538943745146953495973014350614E+00
a(13, 9) = -1.2974380337600327021222956536808230517716E+00
a(13,10) = 5.9822684827188431105752038905995447885348E-01
a(13,11) = -2.4107078892562108246647516780668823095046E-02
a(13,12) = 4.5319136185137669988740390100397569527517E-03
c(13) = 1.0000000000000000000000000000000000000000E+00
b( 1) = 1.1445045431083081161076675575316257764110E-02
b( 2) = 0.0000000000000000000000000000000000000000E+00
b( 3) = 0.0000000000000000000000000000000000000000E+00
b( 4) = 0.0000000000000000000000000000000000000000E+00
b( 5) = 0.0000000000000000000000000000000000000000E+00
b( 6) = 1.5182228814165001267592100569234113490800E-01
b( 7) = 9.3833383282371058262139365435233240765713E-02
b( 8) = 1.3138871401731356660181720771852165705253E-01
b( 9) = 4.2452793993460570894743314052986770767710E-02
b(10) = 4.6614359052634087726314462069090004222681E-02
b(11) = 1.9739340751760337610363200447178885100858E-02
b(12) = 2.7040753297272850676247690093320494184034E-03
b(13) = 0.0000000000000000000000000000000000000000E+00
bp( 1) = 1.1445045431083081161076675575316257764110E-02
bp( 2) = 0.0000000000000000000000000000000000000000E+00
bp( 3) = 0.0000000000000000000000000000000000000000E+00
bp( 4) = 0.0000000000000000000000000000000000000000E+00
bp( 5) = 0.0000000000000000000000000000000000000000E+00
bp( 6) = 1.8963455766836141912201425856209518713321E-01
bp( 7) = 9.9015048411147152930074891966312987547087E-02
bp( 8) = 2.2377720821386995442668671882695678061627E-01
bp( 9) = 1.0466811506175315699681616849938105031123E-01
bp(10) = 1.5358172529459859690396485461784888933400E-01
bp(11) = 1.3940255061073114260364669651015505753606E-01
bp(12) = 6.6309723413523447970758037743751771753948E-02
bp(13) = 1.2166025894932047884961697698182018004080E-02
= R138
-With the same differential equation, h = 0.1 & N = 10 ( don't forget to store 13 into R06 ), it yields:
XEQ "ERKN" >>>> x
= 1
---Execution time = 9m22s---
RDN y(1) = 0.5366306165
RDN y'(1) = -0.8601719269
-The exact results, rounded to 10D are y(1) = 0.5366306164
& y'(1) = -0.8601719268
-So, the error is only 1 unit in the last decimal.
-Of course, it's not very fast with a real HP-41, but with a good emulator
or with a 41CL...
b) Systems of 2 Second-order
differential Equations
-A similar program may be written to solve the system y"
= f(x,y,z) z" = g(x,y,z)
Data Registers: • R00: fg name ( Registers R00 to R08 and R13+2s to R(s2+9.s+22)/2 are to be initialized before executing "ERKN2" )
• R01 = x0
R09 to R12: temp
• R13+2s to R(s2+9.s+22)/2 = the ( s2
+ 5.s - 2 ) / 2 coefficients ai,j ; bi ; ci
• R02 = y0
R13 to R12+2s = kyi & kzi
which are to be stored as shown below:
• R03 = z0
• R04 = h = stepsize
• R05 = N = number of steps
• R06 = y'0
• R07 = z'0
• R08 = s = number of stages
• R13+2s = a2,1
• R14+2s = c2
• R15+2s = a3,1
• R16+2s = a3,2
• R17+2s = c3
......................................................................... ...................
• R(s2+3s+24)/2 = as,1 ................ • R(s2+5s+20)/2 = as,s-1 • R(s2+5s+22)/2 = cs
• R(s2+5s+24)/2 = b1 ............................................................
• R(s2+7s+22)/2 = bs
• R(s2+7s+24)/2 = b'1 ...........................................................
• R(s2+9s+22)/2 = b's
Flags: /
Subroutine: a program that calculates f(x;y;z)
in Y-register and g(x;y;z) in X-register
assuming x is in X-register , y is in Y-register and z is in Z-register
upon entry.
-Line 153 is a three-byte GTO 01
01 LBL "ERKN2"
02 RCL 05 03 STO 09 04 LBL 01 05 13 06 STO 10 07 RCL 08 08 + 09 STO 11 10 5 11 LASTX 12 ST+ Y 13 * 14 2 15 / 16 11 17 + 18 E3 19 / 20 + 21 RCL 08 22 + 23 STO 12 24 RCL 03 25 RCL 02 26 RCL 01 27 XEQ IND 00 28 RCL 04 29 ST* Z 30 * 31 STO IND 11 32 X<>Y |
33 STO 13
34 LBL 02 35 RCL 10 36 INT 37 E3 38 / 39 13 40 + 41 STO 10 42 RCL 08 43 + 44 STO 11 45 CLST 46 LBL 03 47 X<>Y 48 RCL IND 10 49 RCL IND 12 50 * 51 + 52 X<>Y 53 RCL IND 11 54 RCL IND 12 55 * 56 + 57 ISG 12 58 ISG 11 59 CLX 60 ISG 10 61 GTO 03 62 RCL 07 63 RCL IND 12 64 * |
65 +
66 RCL 04 67 * 68 RCL 03 69 + 70 X<>Y 71 RCL 06 72 RCL IND 12 73 * 74 + 75 RCL 04 76 * 77 RCL 02 78 + 79 RCL 04 80 RCL IND 12 81 * 82 RCL 01 83 + 84 XEQ IND 00 85 RCL 04 86 ST* Z 87 * 88 STO IND 11 89 X<>Y 90 STO IND 10 91 ISG 12 92 GTO 02 93 RCL 08 94 1.001 95 - 96 ST- 10 |
97 ST- 11
98 CLST 99 LBL 04 100 X<>Y 101 RCL IND 10 102 RCL IND 12 103 * 104 + 105 X<>Y 106 RCL IND 11 107 RCL IND 12 108 * 109 + 110 ISG 12 111 CLX 112 ISG 11 113 CLX 114 ISG 10 115 GTO 04 116 RCL 07 117 + 118 RCL 04 119 * 120 ST+ 03 121 CLX 122 RCL 06 123 + 124 RCL 04 125 ST+ 01 126 * 127 ST+ 02 128 RCL 08 |
129 ST- 10
130 ST- 11 131 CLST 132 LBL 05 133 X<>Y 134 RCL IND 10 135 RCL IND 12 136 * 137 + 138 X<>Y 139 RCL IND 11 140 RCL IND 12 141 * 142 + 143 ISG 12 144 CLX 145 ISG 11 146 CLX 147 ISG 10 148 GTO 05 149 ST+ 07 150 X<>Y 151 ST+ 06 152 DSE 09 153 GTO 01 154 RCL 03 155 RCL 02 156 RCL 01 157 END |
( 225 bytes
/ SIZE ( s^2+9.s+24 )/2 )
STACK | INPUTS | OUTPUTS |
Z | / | z(x0+N.h) |
Y | / | y(x0+N.h) |
X | / | x0+N.h |
Example:
d2y/dx2 = -y.z
y(0) = 2 y'(0) = 1
Evaluate y(1) , z(1) , y'(1) , z'(1) with
h = 0.1 & N = 10
d2z/dx2 = x.(
y + z ) z(0) = 1
z'(0) = 1
01 LBL "T"
02 RDN 03 STO Z 04 X<>Y 05 CHS 06 ST* Z 07 - 08 R^ 09 * 10 RTN |
"T" ASTO 00
0 STO 01
1 STO 06
2 STO 02
1 STO 07
1 STO 03
0.1 STO 04
10 STO 05
-If we again use the same ( Albrecht ) 5-stage method, store the following coefficients into R23 thru R46
1/32
1/4
R23
R24
-1/24 1/6
1/2
R25 R26
R27
3/32 1/8 1/16
3/4 =
R28 R29 R30
R31
0
3/7 -1/14 1/7 1
R32 R33 R34 R35 R36
7/90 4/15 1/15 4/45
0
R37 R38 R39 R40 R41
7/90 16/45 2/15 16/45 7/90
R42 R43 R44 R45 R46
-Since it is a 5-stage method, 5 STO 08
and
XEQ "ERKN2" >>>> x =
1
---Execution time = 3m41s---
RDN y(1) = 1.531356646 and
R06 = y'(1) = -2.312840140
RDN z(1) = 2.620254282
R07 = z'(1) = 2.941748401
Note:
-To continue the calculations, simply press R/S ( after changing
h & N in registers R04 & R05 if need be )
Control Number of the Array of Coefficients for an S-stage method:
S | bbb.eee |
5
6 7 8 9 10 11 12 13 14 15 16 17 |
23.046
25.056 27.067 29.079 31.092 33.106 35.121 37.137 39.154 41.172 43.191 45.211 47.232 |
-To use the 13-stage 10th-order method mentionned in the paragraph
above,
store the same 116 coefficients into R39 to R154.
-With the same system of 2 differential equations, h = 0.1 & N = 10 ( don't forget to store 13 into R08 ), it yields:
XEQ "ERKN2" >>>> x
= 1
---Execution time = 14m58s---
RDN y(1) = 1.531356645 and
R06 = y'(1) = -2.312840138
RDN z(1) = 2.620254282
R07 = z'(1) = 2.941748401
-Albrecht's method already produced an almost perfect accuracy with
this example,
so the superiority of the 10th-order method is not very apparent
!
-In most cases, however, it's really worthwhile to use high-order formulae...
Notes:
-These programs employs formulae without error-estimate, so you'll
have to calculate again
the solutions with a smaller stepsize - say h/2 - to get
an idea of the precision.
-But in references [2] & [3], you will find the coefficients of
pairs of embedded Runge-Kutta-Nystrom formulas
of various orders to control the stepsize more directly.
References:
[1] Abramowitz and Stegun - "Handbook of Mathematical Functions"
- Dover Publications - ISBN 0-486-61272-4
[2] Erwin Fehlberg - "Classical eighth- and lower-order Runge-Kutta-Nystrom
formulas with stepsize control
for special second-order differential equations" - NASA TR R-381 &
TR R-410
[3] Philip Sharp - http://www.math.auckland.ac.nz/~sharp/rkn1.dat