This program is Copyright © 2007 by Jean-Marc Baillard and is used here by permission.
This program is supplied without representation or warranty of any kind. Jean-Marc Baillard and The Museum of HP Calculators therefore assume no responsibility and shall have no liability, consequential or otherwise, of any kind arising from the use of this program material or any part thereof.
1°) Systems of first-order Differential Equations
a) The "Classical" 4th-order Runge-Kutta
Method
b) A Runge-Kutta Method of order 6 (
new )
c) A Runge-Kutta
Method of order 8 ( new )
d) Runge-Kutta-Fehlberg
4-5 Method ( new )
e) Bulirsch-Stoer
Method ( new )
2°) Systems of second-order Conservative Equations
a) Systems of 2
Equations ( new )
b) Systems of 3
Equations ( new )
c) Systems of n
Equations ( new )
-The programs listed in paragraph 1°) solve a system of n first-order differential equations:
dy1/dx = f1(x,y1,
... ,yn)
dy2/dx = f2(x,y1,
... ,yn)
..................
with the initial values: yi(x0)
i = 1 , ... , n
dyn/dx = fn(x,y1, ... ,yn)
-In paragraph 2°) the HP-41 solves systems of second-order equations where the first derivatives y'i(x) do not appear explicitly:
d2y1/dx2 =
f1(x,y1, ... ,yn)
d2y2/dx2
= f2(x,y1, ... ,yn)
..................
with the initial values: yi(x0)
, y'i(x0)
i = 1 , ... , n
d2yn/dx2 = fn(x,y1, ... ,yn)
-All these programs use 2 instructions from the X-functions module:
REGMOVE and REGSWAP - Except in §2°)a)b)
1°) Systems of first-order Differential Equations
a) The "Classical" 4th-order
Runge-Kutta Method
Data Registers: • R00 = subroutine name ( Registers R00 thru R03 and R10 thru R10+n are to be initialized before executing "RK4" )
• R01 = n = number of equations = number of functions
R04 thru R09: temp
• R02 = h = stepsize
• R03 = N = number of steps
• R10 = x0
• R11 = y1(x0)
R11+n thru R10+4n: temp
• R12 = y2(x0)
............... ( initial
values )
• R10+n = yn(x0)
Flags: F06-F07
Subroutine: A program which calculates
and stores f1 ( x, y1 , ... , yn)
, ... , fn ( x, y1 , ... , yn) in
registers R11+n, ... , R10+2n respectively
with x, y1, ... , yn in regiters R10, R11,
... , R10+n
If you don't have an HP-41 CX, line 24 can be replaced by the 5 lines:
0
LBL 00
STO IND Y
ISG Y
GTO 00
01 LBL "RK4"
02 RCL 03
03 STO 09
04 RCL 01
05 RCL 01
06 RCL 01
07 10.01
08 +
09 STO 04
10 INT
11 +
12 STO 05
13 +
14 STO 06
15 +
16 STO 07
17 RCL 05
18 RCL 06
19 1
20 +
21 E3
22 /
23 +
24 CLRGX
25 11
26 LASTX
27 +
28 RCL 01
29 E6
30 /
31 +
32 STO 08
33 GTO 03
34 LBL 01
35 XEQ IND 00
36 LBL 02
37 RCL IND 05
38 RCL 02
39 *
40 ST+ IND 06
41 FS? 06
42 ST+ IND 06
43 FC? 07
44 ST+ X
45 RCL IND 07
46 +
47 STO IND 04
48 DSE 07
49 DSE 06
50 DSE 05
51 DSE 04
52 GTO 02
53 RCL 01
54 ST+ 04
55 ST+ 05
56 ST+ 06
57 ST+ 07
58 RTN
59 LBL 03
60 RCL 08
61 REGMOVE
62 CF 06
63 SF 07
64 XEQ 01
65 SF 06
66 RCL 02
67 ST+ 10
68 XEQ 01
69 CF 07
70 XEQ 01
71 CF 06
72 RCL 02
73 ST+ 10
74 XEQ 01
75 RCL 08
76 REGSWAP
77 RCL 04
78 RCL 06
79 3
80 SIGN
81 LBL 04
82 CLX
83 X<> IND Y
84 LASTX
85 /
86 ST+ IND Z
87 DSE Y
88 DSE Z
89 GTO 04
90 DSE 09
91 GTO 03
92 RCL 13
93 RCL 12
94 RCL 11
95 RCL 10
96 END
( 155 bytes / SIZE 4n+11 )
STACK | INPUTS | OUTPUTS |
T | / | y3(x0+N.h) |
Z | / | y2(x0+N.h) |
Y | / | y1(x0+N.h) |
X | / | x0+N.h |
Example: Let's solve the system
dy1/dx = - y1y2y3
dy2/dx = x ( y1+y2-y3
)
dy3/dx = xy1- y2y3
with the initial values: y1(0) = 1 ; y2(0) = 1 ; y3(0) = 2
x ; y1 ; y2 ; y3 will be in R10
; R11 ; R12 ; R13 respectively, and we have to write a program to compute
the 3 functions
and store the results in R14 ; R15 ; R16 ( just after the
"initial-value registers" ).
For instance, the following subroutine will do the job - let's call
it "T"
01 LBL "T"
02 RCL 11
03 RCL 12
04 RCL 13
05 *
06 *
07 CHS
08 STO 14
09 RCL 11
10 RCL 12
11 +
12 RCL 13
13 -
14 RCL 10
15 *
16 STO 15
17 RCL 10
18 RCL 11
19 *
20 RCL 12
21 RCL 13
22 *
23 -
24 STO16
25 RTN
We store the name of the subroutine in R00 "T"
ASTO 00
the numbers of equations in R01
3 STO 01
then the initial values: x
in R10
0 STO 10
y1 in R11
1 STO 11
y2 in R12
1 STO 12
y3 in R13
2 STO 13
Suppose we want to know y1(1) , y2(1) , y3(1) with a step size h = 0.1 and therefore N = 10
h/2 is stored in R02
0.05 STO 02
N is stored in R03
10 STO 03 and XEQ "RK4"
about 2mn24s later, the HP-41 gives:
x = 1
in X and R10
y1(1) = 0.2582093855 in Y and R11
y2(1) = 1.157619553 in Z and
R12
y3(1) = 0.8421786516 in T and R13
-To continue with the same h and N, simply press R/S and you'll have y1(2) y2(2) y3(2)
-An estimation of the accuracy may be obtained by doing the calculation again with a smaller step size like h=0.05
It yields: y1(1) = 0.2582079989 y2(1) = 1.157623732 y3(1) = 0.8421783424
Theoretically, the results tend to the exact solution as h tends to
zero,
but naturally, roundoff errors ( and execution time ) will limit the
accuracy attainable!
b) A Runge-Kutta Method of
Order 6
Data Registers: • R00 = subroutine name ( Registers R00 thru R03 and R20 thru R20+n are to be initialized before executing "RK6" )
• R01 = n = number of equations = number of functions
R04 thru R13: temp R14 thru R19:
unused
• R02 = h = stepsize
• R03 = N = number of steps
• R20 = x0
• R21 = y1(x0)
R21+n thru R20+8n: temp
• R22 = y2(x0)
............... ( initial
values )
• R20+n = yn(x0)
Flags: /
Subroutine: A program which calculates
and stores f1 ( x, y1 , ... , yn)
, ... , fn ( x, y1 , ... , yn) in
registers R21+n, ... , R20+2n respectively
with x, y1, ... , yn in regiters R20, R21,
... , R20+n
01 LBL "RK6"
02 RCL 03
03 STO 04
04 21.021
05 RCL 01
06 E6
07 /
08 +
09 RCL 01
10 7
11 *
12 +
13 STO 05
14 RCL 01
15 RCL 01
16 RCL 01
17 20.02
18 +
19 STO 06
20 +
21 STO 07
22 +
23 STO 08
24 +
25 STO 09
26 +
27 STO 10
28 +
29 STO 11
30 +
31 STO 12
32 LBL 01
33 RCL 20
34 STO 13
35 RCL 05
36 REGSWAP
37 REGMOVE
38 XEQ IND 00
39 LBL 02
40 RCL IND 07
41 RCL 02
42 *
43 STO IND 08
44 3
45 /
46 ST+ IND 06
47 DSE 08
48 DSE 07
49 DSE 06
50 GTO 02
51 RCL 01
52 ST+ 06
53 ST+ 07
54 ST+ 08
55 RCL 02
56 LASTX
57 /
58 ST+ 20
59 XEQ IND 00
60 RCL 05
61 REGMOVE
62 LBL 03
63 RCL IND 07
64 RCL 02
65 *
66 STO IND 09
67 1.5
68 /
69 ST+ IND 06
70 DSE 09
71 DSE 07
72 DSE 06
73 GTO 03
74 RCL 01
75 ST+ 06
76 ST+ 07
77 ST+ 09
78 RCL 02
79 3
80 /
81 ST+ 20
82 XEQ IND 00
83 RCL 05
84 REGMOVE
85 LBL 04
86 RCL IND 07
87 RCL 02
88 *
89 STO IND 10
90 RCL IND 09
91 4
92 *
93 -
94 RCL IND 08
95 -
96 12
97 /
98 ST- IND 06
99 DSE 10
100 DSE 09
101 DSE 08
102 DSE 07
103 DSE 06
104 GTO 04
105 RCL 01
106 ST+ 06
107 ST+ 07
108 ST+ 08
109 ST+ 09
110 ST+ 10
111 RCL 02
112 3
113 /
114 ST- 20
115 XEQ IND 00
116 RCL 05
117 REGMOVE
118 LBL 05
119 RCL IND 07
120 RCL 02
121 *
122 STO IND 11
123 18
124 *
125 RCL IND 10
126 7
127 *
128 +
129 RCL IND 09
130 22
131 *
132 -
133 RCL IND 08
134 5
135 *
136 +
137 9.6
138 /
139 ST+ IND 06
140 DSE 11
141 DSE 10
142 DSE 09
143 DSE 08
144 DSE 07
145 DSE 06
146 GTO 05
147 RCL 01
148 ST+ 06
149 ST+ 07
150 ST+ 08
151 ST+ 09
152 ST+ 10
153 ST+ 11
154 RCL 02
155 2
156 /
157 ST+ 20
158 XEQ IND 00
159 RCL 05
160 REGMOVE
161 LBL 06
162 RCL IND 07
163 RCL 02
164 *
165 STO IND 12
166 5
167 /
168 RCL IND 11
169 +
170 RCL IND 10
171 4
172 /
173 -
174 RCL IND 08
175 18
176 *
177 RCL IND 09
178 55
179 *
180 -
181 60
182 /
183 +
184 2
185 /
186 ST+ IND 06
187 DSE 12
188 DSE 11
189 DSE 10
190 DSE 09
191 DSE 08
192 DSE 07
193 DSE 06
194 GTO 06
195 RCL 01
196 ST+ 06
197 ST+ 07
198 ST+ 08
199 ST+ 09
200 ST+ 10
201 ST+ 11
202 ST+ 12
203 RCL 02
204 6
205 /
206 RCL 13
207 +
208 STO 20
209 XEQ IND 00
210 RCL 05
211 REGMOVE
212 LBL 07
213 RCL IND 07
214 RCL 02
215 *
216 80
217 X<>Y
218 ST* Y
219 X<> IND 09
220 99
221 *
222 +
223 RCL IND 11
224 118
225 *
226 -
227 20
228 *
229 RCL IND 12
230 ST+ IND 09
231 128
232 *
233 +
234 RCL IND 10
235 ST+ IND 11
236 215
237 *
238 +
239 RCL IND 08
240 783
241 *
242 -
243 780
244 /
245 ST+ IND 06
246 DSE 12
247 DSE 11
248 DSE 10
249 DSE 09
250 DSE 08
251 DSE 07
252 DSE 06
253 GTO 07
254 RCL 01
255 ST+ 06
256 ST+ 07
257 ST+ 08
258 ST+ 09
259 ST+ 10
260 ST+ 11
261 ST+ 12
262 RCL 02
263 RCL 13
264 +
265 STO 20
266 XEQ IND 00
267 RCL 05
268 REGMOVE
269 LBL 08
270 RCL IND 07
271 RCL 02
272 *
273 RCL IND 08
274 +
275 13
276 *
277 RCL IND 09
278 32
279 *
280 +
281 RCL IND 11
282 55
283 *
284 +
285 .5
286 %
287 ST+ IND 06
288 DSE 11
289 DSE 09
290 DSE 08
291 DSE 07
292 DSE 06
293 GTO 08
294 RCL 01
295 ST+ 06
296 ST+ 07
297 ST+ 08
298 ST+ 09
299 ST+ 11
300 DSE 04
301 GTO 01
a three-byte GTO ( or replace this line by GTO 15 and
line 32 by LBL 15 )
302 RCL 23
303 RCL 22
304 RCL 21
305 RCL 20
306 END
( 498 bytes / SIZE 21+8n )
STACK | INPUTS | OUTPUTS |
T | / | y3(x0+N.h) |
Z | / | y2(x0+N.h) |
Y | / | y1(x0+N.h) |
X | / | x0+N.h |
Example:
dy/dx = -y.z.u
y(0) = 1 Evaluate
y(1) , z(1) , u(1) with h = 0.1 ( whence
N = 10 )
dz/dx = x.( y + z - u )
z(0) = 1
du/dx = x.y - z.u
u(0) = 2
LBL "T" *
RCL 21 -
RCL 20 RCL 23
RTN "T"
ASTO 00
RCL 21 *
RCL 22 RCL 20
RCL 21 *
RCL 22 CHS
+
*
*
-
RCL 23 STO 24
RCL 23 STO 25
RCL 22 STO 26
Initial values: 0 STO
20
1 STO 21 STO 22
2 STO 23
n = 3 STO 01 (
3 functions )
h = 0.1 STO 02
N = 10 STO 03 XEQ "RK6" >>>>
x = 1
= R20
( in 6mn28s )
RDN y(1) = 0.258207889 = R21
y(1) = 0.258207906
RDN z(1) = 1.157623948 = R22
the exact results, rounded to 9D are
z(1) = 1.157623981
RDN u(1) = 0.842178329 = R23
u(1) = 0.842178312
-To continue the calculations, simply press R/S ( after changing
h & N in registers R02 & R03 if needed )
c) A Runge-Kutta Method of
Order 8
Data Registers: • R00 = subroutine name ( Registers R00 to R03 , R14 to R48 and R50 to R50+n are to be initialized before executing "RK8" )
• R01 = n = number of equations = number of functions
R04 thru R13: temp R49: temp
• R02 = h = stepsize
• R03 = N = number of steps
• R14 thru R48 = Constants
• R50 = x0
• R51 = y1(x0)
R51+n thru R50+9n: temp
• R52 = y2(x0)
............... ( initial
values )
• R50+n = yn(x0)
•
R14 = 0.8961811934
• R23 = 0.1996369936
• R32 = 0.9576053440
• R41 = 0.9401094520
•
R15 = -0.2117115009
• R24 = 0.09790045616
• R33 = -0.6325461607
• R42 = -2.229158210
•
R16 = 0.8273268354
• R25 = 0.3285172131
• R34 = 0.1527777778
• R43 = 7.553840442
•
R17 = 0.06514850915
• R26 = -0.3497052863
• R35 = -0.009086961101
• R44 = -7.164951553
•
R18 = 0.5766714727
• R27 = -0.03302551131
• R36 = 1.062498447
• R45 = 2.451380432
•
R19 = 0.1855068535
• R28 = 0.1289862930
• R37 = -1.810863083
• R46 = 0.05
•
R20 = 0.3865246267
• R29 = 0.1726731646
• R38 = 2.031083139
• R47 = 0.2722222222
•
R21 = -0.4634553896
• R30 = -0.01186868389
• R39 = -0.6379313502
• R48 = 0.3555555556
•
R22 = 0.3772937693
• R31 = 0.002002165993
• R40 = -0.5512205631
Flags: /
Subroutine: A program which calculates
and stores f1 ( x, y1 , ... , yn)
, ... , fn ( x, y1 , ... , yn) in
registers R51+n, ... , R50+2n respectively
with x, y1, ... , yn in regiters R50, R51,
... , R50+n
01 LBL "RK8"
02 51.051
03 RCL 01
04 E6
05 /
06 +
07 RCL 01
08 8
09 *
10 +
11 STO 05
12 RCL 01
13 RCL 01
14 RCL 01
15 50.05
16 +
17 STO 06
18 +
19 STO 07
20 +
21 STO 08
22 +
23 STO 09
24 +
25 STO 10
26 +
27 STO 11
28 +
29 STO 12
30 +
31 STO 13
32 RCL 03
33 STO 49
34 GTO 01
35 LBL 00
36 XEQ IND 00
37 RCL 05
38 REGMOVE
39 RTN
40 LBL 01
41 RCL 50
42 STO 04
43 RCL 05
44 REGSWAP
45 REGMOVE
46 XEQ IND 00
47 LBL 02
48 RCL IND 07
49 RCL 02
50 *
51 STO IND 08
52 2
53 /
54 ST+ IND 06
55 DSE 08
56 DSE 07
57 DSE 06
58 GTO 02
59 RCL 01
60 ST+ 06
61 ST+ 07
62 ST+ 08
63 RCL 02
64 LASTX
65 /
66 ST+ 50
67 XEQ 00
68 LBL 03
69 RCL IND 07
70 RCL 02
71 *
72 STO IND 09
73 RCL IND 08
74 +
75 4
76 /
77 ST+ IND 06
78 DSE 09
79 DSE 08
80 DSE 07
81 DSE 06
82 GTO 03
83 RCL 01
84 ST+ 06
85 ST+ 07
86 ST+ 08
87 ST+ 09
88 XEQ 00
89 LBL 04
90 RCL IND 07
91 RCL 02
92 *
93 STO IND 10
94 RCL 14
95 *
96 RCL IND 09
97 RCL 15
98 *
99 +
100 RCL IND 08
101 7
102 /
103 +
104 ST+ IND 06
105 DSE 10
106 DSE 09
107 DSE 08
108 DSE 07
109 DSE 06
110 GTO 04
111 RCL 01
112 ST+ 06
113 ST+ 07
114 ST+ 08
115 ST+ 09
116 ST+ 10
117 RCL 02
118 RCL 16
119 *
120 RCL 04
121 +
122 STO 50
123 XEQ 00
124 LBL 05
125 RCL IND 07
126 RCL 02
127 *
128 STO IND 11
129 RCL 17
130 *
131 RCL IND 10
132 RCL 18
133 *
134 +
135 RCL IND 08
136 RCL 19
137 *
138 +
139 ST+ IND 06
140 DSE 11
141 DSE 10
142 DSE 08
143 DSE 07
144 DSE 06
145 GTO 05
146 RCL 01
147 ST+ 06
148 ST+ 07
149 ST+ 08
150 ST+ 10
151 ST+ 11
152 XEQ 00
153 LBL 06
154 RCL IND 07
155 RCL 02
156 *
157 STO IND 12
158 RCL 20
159 *
160 RCL IND 11
161 RCL 21
162 *
163 +
164 RCL IND 10
165 RCL 22
166 *
167 +
168 RCL IND 08
169 RCL 23
170 *
171 +
172 ST+ IND 06
173 DSE 12
174 DSE 11
175 DSE 10
176 DSE 08
177 DSE 07
178 DSE 06
179 GTO 06
180 RCL 01
181 ST+ 06
182 ST+ 07
183 ST+ 08
184 ST+ 10
185 ST+ 11
186 ST+ 12
187 RCL 02
188 2
189 /
190 RCL 04
191 +
192 STO 50
193 XEQ 00
194 LBL 07
195 RCL IND 07
196 RCL 02
197 *
198 STO IND 13
199 RCL 24
200 *
201 RCL IND 12
202 RCL 25
203 *
204 +
205 RCL IND 11
206 RCL 26
207 *
208 +
209 RCL IND 10
210 RCL 27
211 *
212 +
213 RCL IND 08
214 RCL 28
215 *
216 +
217 ST+ IND 06
218 DSE 13
219 DSE 12
220 DSE 11
221 DSE 10
222 DSE 08
223 DSE 07
224 DSE 06
225 GTO 07
226 RCL 01
227 ST+ 06
228 ST+ 07
229 ST+ 08
230 ST+ 10
231 ST+ 11
232 ST+ 12
233 ST+ 13
234 RCL 02
235 RCL 29
236 *
237 RCL 04
238 +
239 STO 50
240 XEQ 00
241 LBL 08
242 RCL IND 07
243 RCL 02
244 *
245 STO IND 09
246 9
247 /
248 RCL IND 13
249 RCL 30
250 *
251 +
252 RCL IND 12
253 RCL 31
254 *
255 +
256 RCL IND 08
257 14
258 /
259 +
260 ST+ IND 06
261 DSE 13
262 DSE 12
263 DSE 09
264 DSE 08
265 DSE 07
266 DSE 06
267 GTO 08
268 RCL 01
269 ST+ 06
270 ST+ 07
271 ST+ 08
272 ST+ 09
273 ST+ 12
274 ST+ 13
275 XEQ 00
276 LBL 09
277 RCL IND 07
278 RCL 02
279 *
280 STO IND 10
281 RCL 32
282 *
283 RCL IND 09
284 RCL 33
285 *
286 +
287 RCL IND 13
288 RCL 34
289 *
290 +
291 RCL IND 12
292 RCL 35
293 *
294 +
295 RCL IND 08
296 32
297 /
298 +
299 ST+ IND 06
300 DSE 13
301 DSE 12
302 DSE 10
303 DSE 09
304 DSE 08
305 DSE 07
306 DSE 06
307 GTO 09
308 RCL 01
309 ST+ 06
310 ST+ 07
311 ST+ 08
312 ST+ 09
313 ST+ 10
314 ST+ 12
315 ST+ 13
316 RCL 02
317 2
318 /
319 RCL 04
320 +
321 STO 50
322 XEQ 00
323 LBL 10
324 RCL IND 07
325 RCL 02
326 *
327 STO IND 11
328 RCL 36
329 *
330 RCL IND 10
331 RCL 37
332 *
333 +
334 RCL IND 09
335 RCL 38
336 *
337 +
338 RCL IND 13
339 RCL 39
340 *
341 +
342 RCL IND 12
343 9
344 /
345 +
346 RCL IND 08
347 14
348 /
349 +
350 ST+ IND 06
351 DSE 13
352 DSE 12
353 DSE 11
354 DSE 10
355 DSE 09
356 DSE 08
357 DSE 07
358 DSE 06
359 GTO 10
360 RCL 01
361 ST+ 06
362 ST+ 07
363 ST+ 08
364 ST+ 09
365 ST+ 10
366 ST+ 11
367 ST+ 12
368 ST+ 13
369 RCL 02
370 RCL 16
371 *
372 RCL 04
373 +
374 STO 50
375 XEQ 00
376 LBL 11
377 RCL IND 07
378 RCL 02
379 *
380 X<> IND 12
381 RCL 40
382 *
383 RCL IND 12
384 RCL 41
385 *
386 +
387 RCL IND 11
388 RCL 42
389 *
390 +
391 RCL IND 10
392 RCL 43
393 *
394 +
395 RCL IND 09
396 RCL 44
397 *
398 +
399 RCL IND 13
400 RCL 45
401 *
402 +
403 ST+ IND 06
404 DSE 13
405 DSE 12
406 DSE 11
407 DSE 10
408 DSE 09
409 DSE 07
410 DSE 06
411 GTO 11
412 RCL 01
413 ST+ 06
414 ST+ 07
415 ST+ 09
416 ST+ 10
417 ST+ 11
418 ST+ 12
419 ST+ 13
420 RCL 02
421 RCL 04
422 +
423 STO 50
424 XEQ 00
425 LBL 12
426 RCL IND 07
427 RCL 02
428 *
429 RCL IND 08
430 +
431 RCL 46
432 *
433 RCL IND 10
434 RCL IND 12
435 +
436 RCL 47
437 *
438 +
439 RCL IND 11
440 RCL 48
441 *
442 +
443 ST+ IND 06
444 DSE 12
445 DSE 11
446 DSE 10
447 DSE 08
448 DSE 07
449 DSE 06
450 GTO 12
451 RCL 01
452 ST+ 06
453 ST+ 07
454 ST+ 08
455 ST+ 10
456 ST+ 11
457 ST+ 12
458 DSE 49
459 GTO 01
a three-byte GTO
460 RCL 53
461 RCL 52
462 RCL 51
463 RCL 50
464 END
( 765 bytes / SIZE 51+9n )
STACK | INPUTS | OUTPUTS |
T | / | y3(x0+N.h) |
Z | / | y2(x0+N.h) |
Y | / | y1(x0+N.h) |
X | / | x0+N.h |
Example:
dy/dx = -y.z.u
y(0) = 1 Evaluate
y(1) , z(1) , u(1) with h = 0.1 and N =
10
dz/dx = x.( y + z - u )
z(0) = 1
du/dx = x.y - z.u
u(0) = 2
LBL "T" *
RCL 51 -
LASTX RCL 53
RTN
"T"
ASTO 00
RCL 51 *
RCL 52 RCL 50
RCL 51 *
RCL 52 CHS
+
*
*
-
RCL 53 STO 54
RCL 53 STO 55
RCL 52 STO 56
Initial values: 0 STO
50
1 STO 51 STO 52
2 STO 53
n = 3 STO 01 (
3 functions )
h = 0.1 STO 02
N = 10 STO 03 XEQ "RK8" >>>>
x = 1
= R50
( in 9mn31s )
RDN y(1) = 0.258207906 = R51
y(1) = 0.258207906
RDN z(1) = 1.157623979 = R52
the exact results, rounded to 9D are
z(1) = 1.157623981
RDN u(1) = 0.842178313 = R53
u(1) = 0.842178312
-To continue the calculations, simply press R/S ( after changing
h & N in registers R02 & R03 if needed )
-If you replace lines 431 thru 442 by 9 * RCL IND
10 RCL IND 12 + 49 * + RCL IND 11
64 * + PI R-D /
registers R46-R47-R48 will be unused.
d) Runge-Kutta-Fehlberg 4-5
Method
-The following program uses a 4th-order formula to compute the solution,
and the difference between this 4th-order formula and a 5th-order
formula provides an error estimate.
Data Registers: • R00 = subroutine name ( Registers R00 thru R03 and R20 thru R20+n are to be initialized before executing "RKF" )
• R01 = n = number of equations = number of functions
R04 thru R14: temp R15 thru R19:
unused
• R02 = h = stepsize
• R03 = N = number of steps
• R20 = x0
at the end:
• R21 = y1(x0)
R21+n = err(y1)
R21+n thru R20+8n: temp
• R22 = y2(x0)
R22+n = err(y2)
...............
......................
• R20+n = yn(x0) R20+2n = err(yn)
Where err(yi) is an error-estimate of yi ( during the calculations, these error-estimates are moved in registers R21+2n .... R20+3n )
Flags: /
Subroutine: A program which calculates
and stores f1 ( x, y1 , ... , yn)
, ... , fn ( x, y1 , ... , yn) in
registers R21+n, ... , R20+2n respectively
with x, y1, ... , yn in regiters R20, R21,
... , R20+n
01 LBL "RKF"
02 21.021
03 RCL 01
04 E6
05 /
06 +
07 RCL 01
08 7
09 *
10 +
11 STO 05
12 FRC
13 RCL 01
14 .1
15 %
16 +
17 +
18 RCL 01
19 +
20 21
21 +
22 STO 06
23 RCL 01
24 ST+ X
25 E3
26 /
27 RCL 01
28 +
29 21.02
30 +
31 CLRGX
If you don't have an HP-41 CX, replace this line by 0
LBL 00 STO IND Y ISG Y GTO 00
32 RCL 01
33 RCL 01
34 LASTX
35 1
36 -
37 +
38 STO 07
39 +
40 STO 08
41 +
42 STO 13
43 +
44 STO 09
45 +
46 STO 10
47 +
48 STO 11
49 +
50 STO 12
51 LBL 10
52 RCL 03
53 STO 04
54 RCL 06
55 REGSWAP
56 LBL 01
57 RCL 20
58 STO 14
59 RCL 05
60 REGSWAP
61 REGMOVE
62 XEQ IND 00
63 LBL 02
64 RCL IND 08
65 RCL 02
66 *
67 STO IND 09
68 ST+ X
69 9
70 /
71 ST+ IND 07
72 DSE 09
73 DSE 08
74 DSE 07
75 GTO 02
76 RCL 01
77 ST+ 07
78 ST+ 08
79 ST+ 09
80 RCL 02
81 ST+ X
82 LASTX
83 /
84 ST+ 20
85 XEQ IND 00
86 RCL 05
87 REGMOVE
88 LBL 03
89 RCL IND 08
90 RCL 02
91 *
92 4
93 /
94 STO IND 10
95 RCL IND 09
96 12
97 /
98 +
99 ST+ IND 07
100 DSE 10
101 DSE 09
102 DSE 08
103 DSE 07
104 GTO 03
105 RCL 01
106 ST+ 07
107 ST+ 08
108 ST+ 09
109 ST+ 10
110 RCL 02
111 9
112 /
113 ST+ 20
114 XEQ IND 00
115 RCL 05
116 REGMOVE
117 LBL 04
118 RCL IND 08
119 RCL 02
120 *
121 STO IND 11
122 270
123 *
124 RCL IND 10
125 972
126 *
127 -
128 RCL IND 09
129 69
130 *
131 +
132 128
133 /
134 ST+ IND 07
135 DSE 11
136 DSE 10
137 DSE 09
138 DSE 08
139 DSE 07
140 GTO 04
141 RCL 01
142 ST+ 07
143 ST+ 08
144 ST+ 09
145 ST+ 10
146 ST+ 11
147 RCL 02
148 2.4
149 /
150 ST+ 20
151 XEQ IND 00
152 RCL 05
153 REGMOVE
154 LBL 05
155 RCL IND 08
156 RCL 02
157 *
158 64
159 *
160 STO IND 12
161 RCL IND 09
162 85
163 *
164 -
165 60
166 /
167 RCL IND 10
168 RCL IND 11
169 5
170 /
171 -
172 27
173 *
174 +
175 ST+ IND 07
176 DSE 12
177 DSE 11
178 DSE 10
179 DSE 09
180 DSE 08
181 DSE 07
182 GTO 05
183 RCL 01
184 ST+ 07
185 ST+ 08
186 ST+ 09
187 ST+ 10
188 ST+ 11
189 ST+ 12
190 RCL 02
191 ST+ 14
192 RCL 14
193 STO 20
194 XEQ IND 00
195 RCL 05
196 REGMOVE
197 LBL 06
198 RCL IND 08
199 RCL 02
200 *
201 15
202 *
203 ST+ IND 12
204 RCL IND 12
205 RCL IND 11
206 351
207 *
208 +
209 RCL IND 10
210 540
211 *
212 -
213 RCL IND 09
214 65
215 *
216 +
217 432
218 /
219 ST+ IND 07
220 DSE 12
221 DSE 11
222 DSE 10
223 DSE 09
224 DSE 08
225 DSE 07
226 GTO 06
227 RCL 01
228 ST+ 07
229 ST+ 08
230 ST+ 09
231 ST+ 10
232 ST+ 11
233 ST+ 12
234 RCL 02
235 6
236 /
237 ST- 20
238 XEQ IND 00
239 RCL 05
240 REGMOVE
241 LBL 07
242 RCL IND 08
243 RCL 02
244 *
245 72
246 *
247 RCL IND 12
248 -
249 RCL IND 11
250 9
251 *
252 +
253 RCL IND 09
254 ST+ X
255 -
256 3
257 1/X
258 %
259 ST- IND 13
260 RCL IND 12
261 RCL IND 11
262 81
263 *
264 +
265 PI
266 R-D
267 /
268 RCL IND 09
269 9
270 /
271 +
272 ST+ IND 07
273 DSE 13
274 DSE 12
275 DSE 11
276 DSE 09
277 DSE 08
278 DSE 07
279 GTO 07
280 RCL 01
281 ST+ 07
282 ST+ 08
283 ST+ 09
284 ST+ 11
285 ST+ 12
286 ST+ 13
287 RCL 14
288 STO 20
289 DSE 04
290 GTO 01
a three-byte GTO
291 RCL 06
292 REGSWAP
293 RCL 23
294 RCL 22
295 RCL 21
296 RCL 20
297 RTN
298 GTO 10
a three-byte GTO
299 END
( 481 bytes / SIZE 21+8n )
STACK | INPUTS | OUTPUTS |
T | / | y3(x0+N.h) |
Z | / | y2(x0+N.h) |
Y | / | y1(x0+N.h) |
X | / | x0+N.h |
Example:
dy/dx = -y.z.u
y(0) = 1 Evaluate
y(1) , z(1) , u(1) with h = 0.1 & N
= 10
dz/dx = x.( y + z - u )
z(0) = 1
du/dx = x.y - z.u
u(0) = 2
LBL "T" *
RCL 21 -
RCL 20 RCL 23
RTN "T"
ASTO 00
RCL 21 *
RCL 22 RCL 20
RCL 21 *
RCL 22 CHS
+
*
*
-
RCL 23 STO 24
RCL 23 STO 25
RCL 22 STO 26
Initial values: 0 STO
20
1 STO 21 STO 22
2 STO 23
n = 3 STO 01 (
3 functions )
h = 0.1 STO 02
N = 10 STO 03 XEQ "RKF" >>>>
x = 1
= R20
( in 5mn40s )
RDN y(1) = 0.258207319 = R21
err(y) = -603 E-9 = R24
RDN z(1) = 1.157624973 = R22
and the error estimates
err(z) = 1062 E-9 = R25
RDN u(1) = 0.842178529 = R23
err(u) = 1768 E-9 = R26
-Actually, the true errors are -587 E-9 for y(1) 992 E-9 for z(1) 217 E-9 for u(1)
-To continue the calculations, simply press R/S ( after changing h & N in registers R02 & R03 if needed )
-If you want to use the 5th-order formula to compute yi(x)
, replace line 259 with ST+ IND 07 ST+ IND 13 but the
errors
will be probably overestimated.
-In the above example, it gives: y(1) = 0.258207897
z(1) = 1.157624056
u(1) = 0.842178340
e) Bulirsch-Stoer Method
-This program uses the formulae given in "The Bulirsch-Stoer Method
for the HP-41" and - first of all - in "Numerical Recipes"
Data Registers: • R00 = subroutine name ( Registers R00-R01-R02 and R20 thru R20+n are to be initialized before executing "BST" )
• R01 = n = number of equations = number of functions
R03 thru R18: temp R19: unused
• R02 = tolerance = a small positive number
that specifies the desired accuracy
• R20 = x0
• R21 = y1(x0)
R21+n thru R20+14n: temp
• R22 = y2(x0)
............... ( initial
values )
• R20+n = yn(x0)
Flags: F09-F10
Subroutine: A program which calculates
and stores f1 ( x, y1 , ... , yn)
, ... , fn ( x, y1 , ... , yn) in
registers R21+n, ... , R20+2n respectively
with x, y1, ... , yn in regiters R20, R21,
... , R20+n
01 LBL "BST"
02 STO 03
03 1
04 STO 04
05 9
06 STO 05
07 21.021
08 RCL 01
09 E6
10 /
11 +
12 RCL 01
13 5
14 *
15 +
16 STO 08
17 RCL 01
18 ST+ X
19 ST- Y
20 .1
21 %
22 -
23 -
24 STO 16
25 20.02
26 RCL 01
27 +
28 STO 10
29 INT
30 .1
31 %
32 RCL 01
33 STO T
34 +
35 +
36 STO 11
37 +
38 STO 12
39 +
40 STO 13
41 +
42 STO 14
43 GTO 01
44 LBL 00
45 2
46 ST/ 04
47 GTO 02
48 LBL 01
49 RCL 20
50 STO 15
51 RCL 08
52 REGSWAP
53 REGMOVE
54 XEQ IND 00
55 RCL 16
56 REGMOVE
57 6
58 RCL 05
59 X>Y?
60 GTO 02
61 RCL 04
62 ST+ 04
63 LBL 02
64 SF 09
65 RCL 04
66 STO 17
67 ABS
68 RCL 03
69 RCL 15
70 -
71 ABS
72 X<=Y?
73 CF 09
74 X>Y?
75 X<>Y
76 LASTX
77 SIGN
78 *
79 STO 04
80 SF 10
81 CLX
82 STO 05
83 RCL 08
84 INT
85 STO 09
86 LBL 03
87 RCL 08
88 REGMOVE
89 2
90 ST+ 05
91 18
92 RCL 05
93 X=Y?
94 GTO 00
95 RCL 01
96 ST+ 09
97 SIGN
98 -
99 E3
100 /
101 ISG X
102 STO 07
103 RCL 04
104 RCL 05
105 /
106 STO 06
107 LBL 04
108 RCL IND 12
109 RCL 06
110 *
111 RCL IND 10
112 STO IND 13
113 +
114 STO IND 14
115 DSE 14
116 DSE 13
117 DSE 12
118 DSE 10
119 GTO 04
120 RCL 01
121 ST+ 10
122 ST+ 12
123 ST+ 13
124 ST+ 14
125 LBL 05
126 RCL 08
127 RCL 01
128 -
129 REGMOVE
130 RCL 06
131 RCL07
132 INT
133 *
134 RCL 15
135 +
136 STO 20
137 XEQ IND 00
138 LBL 06
139 RCL IND 11
140 RCL 06
141 ST+ X
142 *
143 RCL IND 14
144 X<> IND 13
145 +
146 STO IND 14
147 DSE 14
148 DSE 13
149 DSE 11
150 GTO 06
151 RCL 01
152 ST+ 11
153 ST+ 13
154 ST+ 14
155 ISG 07
156 GTO 05
157 RCL 08
158 RCL 01
159 -
160 REGMOVE
161 RCL 04
162 RCL 15
163 +
164 STO 20
165 XEQ IND 00
166 LBL 07
167 RCL IND 11
168 RCL 06
169 *
170 RCL IND 13
171 +
172 ST+ IND 10
173 2
174 ST/ IND 10
175 SIGN
176 ST- 11
177 ST- 13
178 DSE 10
179 GTO 07
180 21
181 RCL 09
182 E3
183 /
184 +
185 RCL 01
186 ST+ 10
187 ST+ 11
188 ST+ 13
189 E6
190 /
191 +
192 REGMOVE
193 FS?C 10
194 GTO 03
a three-byte GTO
195 RCL 09
196 RCL 01
197 +
198 DSE X
199 E3
200 /
201 RCL 09
202 +
203 STO 06
204 CLX
205 STO 18
206 LBL 08
207 RCL 05
208 2
209 ST- Y
210 /
211 STO 07
212 LBL 09
213 RCL 06
214 RCL 07
215 RCL 01
216 *
217 -
218 RCL IND 06
219 ENTER^
220 X<> IND Z
221 STO Z
222 -
223 RCL 05
224 X^2
225 ST* Y
226 RCL 07
227 ST+ X
228 X^2
229 -
230 /
231 +
232 STO IND 06
233 DSE 07
234 GTO 09
235 LASTX
236 ABS
237 RCL 18
238 X<Y?
239 X<>Y
240 STO 18
241 ISG 06
242 GTO 08
243 RCL 02
244 X<Y?
245 GTO 03
a three-byte GTO
246 RCL 09
247 RCL 08
248 FRC
249 +
250 REGMOVE
251 FS? 09
252 GTO 01
a three-byte GTO
253 RCL 23
254 RCL 22
255 RCL 21
256 RCL 20
257 RTN
258 STO 03
259 RCL 04
260 RCL 17
261 X=Y?
262 GTO 01
a three-byte GTO
263 STO 04
264 9
265 STO 05
266 GTO 01
a three-byte GTO
267 END
( 395 bytes / SIZE 21+14n )
STACK | INPUTS | OUTPUTS |
T | / | y3(x1) |
Z | / | y2(x1) |
Y | / | y1(x1) |
X | x1 | x1 |
Example:
dy/dx = -y.z.u
y(0) = 1 Evaluate
y(1) , z(1) , u(1) with a tolerance = 10 -7
dz/dx = x.( y + z - u )
z(0) = 1
du/dx = x.y - z.u
u(0) = 2
LBL "T" *
RCL 21 -
LASTX RCL 23
RTN "T"
ASTO 00
RCL 21 *
RCL 22 RCL 20
RCL 21 *
RCL 22 CHS
+
*
*
-
RCL 23 STO 24
RCL 23 STO 25
RCL 22 STO 26
Initial values: 0 STO
20
1 STO 21 STO 22
2 STO 23
n = 3 STO 01
( 3 functions )
tol = E-7 STO 02
1 XEQ "BST" >>>>
x = 1
= R20
( in 12mn06s )
RDN y(1) = 0.258207909 = R21
y(1) = 0.258207906
RDN z(1) = 1.157623986 = R22
the exact results, rounded to 9D are
z(1) = 1.157623981
RDN u(1) = 0.842178304 = R23
u(1) = 0.842178312
-The long execution time is due to the fact that the method is first
used with H = 1
but the desired accuracy is not satisfied. So the stepsize is
divided by 2.
-To compute y(2) z(2) u(2) key in 2 R/S it yields ( in 6m46s )
y(2) = 0.106363294
y(2) = 0.106363329
z(2) = 3.886706181
the exact results, rounded to 9D are
z(2) = 3.886706159
u(2) = 0.196515847
u(2) = 0.196515847
Notes:
-The initial stepsize is always +/-1 ( line 03 )
-If you want to choose your own initial stepsize, place it in Y-register
after replacing line 03 by X<>Y
-The modified midpoint rule ( and Richarson extrapolation ) are used
with h/2 , h/4 , h/6 , ..... , h/16 ( at most ) until the desired
accuracy is satisfied.
-If this is not satisfied, even with h/16, the stepsize is divided
by 2 ( LBL 00 )
-If - for instance - you want to stop the extrapolation with
h/14, replace line 91 by 16 ( instead of 18 )
-Thus, the SIZE may be reduced to 21+13n
-On the other hand, if you want to continue the extrapolation with
h/18, replace line 91 by 20
-In this case, the SIZE must be at least 21+15n
2°) Systems of second-order
Conservative Equations
-The 3 following programs use 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)
a)
Systems of 2 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.
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
a three-byte GTO
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
LBL "T" CHS
*
"T" ASTO 00
RDN
ST* Z RTN
STO Z -
X<>Y R^
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 )
b)
Systems of 3 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
R10 to R16: temp
• R02 = y0 •
R06 = N = number of steps
• R08 = z'0
• R03 = z0
• 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.
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
a three-byte GTO
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 )
-The subroutine may be difficult to write, but "RKS3" is faster than
"RKS" below, for 3 equations.
c)
Systems of n Equations
Data Registers: • R00 = subroutine name ( Registers R00 thru R03 and R10 thru R10+2n are to be initialized before executing "RKS" )
• R01 = n = number of equations = number of functions
R04 thru R09: temp
• R02 = h = stepsize
• R03 = N = number of steps
• R10 = x0
• R11 = y1(x0)
• R11+n = y'1(x0)
R11+2n thru R10+6n: temp
• R12 = y2(x0)
• R12+n = y'2(x0)
...............
......................
• R10+n = yn(x0) • R10+2n = y'n(x0)
( during the calculations, y'i are moved in registers R11+2n .... R10+3n )
Flags: /
Subroutine: A program which calculates
and stores f1 ( x, y1 , ... , yn)
, ... , fn ( x, y1 , ... , yn) in
registers R11+n, ... , R10+2n respectively
with x, y1, ... , yn in regiters R10, R11,
... , R10+n
01 LBL "RKS"
02 RCL 03
03 STO 04
04 11.011
05 RCL 01
06 E6
07 /
08 +
09 RCL 01
10 5
11 *
12 +
13 STO 05
14 RCL 01
15 RCL 01
16 RCL 01
17 10.01
18 +
19 STO 06
20 +
21 STO 07
22 +
23 STO 08
24 +
25 STO 09
26 LBL 01
27 RCL 05
28 REGSWAP
29 REGMOVE
30 FRC
31 11
32 +
33 RCL 01
34 .1
35 %
36 ST+ X
37 +
38 +
39 REGMOVE
40 XEQ IND 00
41 LBL 02
42 RCL IND 07
43 RCL 02
44 *
45 STO IND 09
46 4
47 /
48 RCL IND 08
49 +
50 RCL 02
51 *
52 2
53 /
54 ST+ IND 06
55 DSE 09
56 DSE 08
57 DSE 07
58 DSE 06
59 GTO 02
60 RCL 01
61 ST+ 06
62 ST+ 07
63 ST+ 08
64 ST+ X
65 ST+ 09
66 RCL 02
67 LASTX
68 /
69 ST+ 10
70 XEQ IND 00
71 RCL 05
72 REGMOVE
73 LBL 03
74 RCL IND 07
75 RCL 02
76 *
77 STO IND 09
78 2
79 /
80 RCL IND 08
81 +
82 RCL 02
83 *
84 ST+ IND 06
85 DSE 09
86 DSE 08
87 DSE 07
88 DSE 06
89 GTO 03
90 RCL 01
91 ST+ 06
92 ST+ 08
93 ST+ 09
94 3
95 *
96 ST+ 07
97 RCL 02
98 2
99 /
100 ST+ 10
101 XEQ IND 00
102 RCL 05
103 REGMOVE
104 LBL 04
105 RCL IND 09
106 ST+ X
107 ST+ IND 07
108 X<> IND 07
109 ST+ IND 07
110 6
111 /
112 RCL IND 08
113 +
114 RCL 02
115 *
116 ST+ IND 06
117 RCL 08
118 RCL 01
119 -
120 RCL IND 07
121 RCL IND Y
122 RCL 02
123 *
124 +
125 6
126 /
127 RCL IND 08
128 +
129 STO IND Y
130 DSE 09
131 DSE 08
132 DSE 07
133 DSE 06
134 GTO 04
135 RCL 01
136 ST+ 06
137 ST- 07
138 ST+ 08
139 DSE 04
140 GTO 01
a three-byte GTO
141 RCL 13
142 RCL 12
143 RCL 11
144 RCL 10
145 END
( 225 bytes / SIZE 6n+11 )
STACK | INPUTS | OUTPUTS |
T | / | y3(x0+N.h) |
Z | / | y2(x0+N.h) |
Y | / | y1(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" *
RCL 11 -
RCL 10 RCL 13
RTN "T"
ASTO 00
RCL 11 *
RCL 12 RCL 10
RCL 11 *
RCL 12 CHS
+
*
*
-
RCL 13 STO 14
RCL 13 STO 15
RCL 12 STO 16
Initial values: 0 STO
10
1 STO 11 STO 12 STO 14
STO 15 STO 16
2 STO 13
n = 3 STO 01 (
3 functions )
h = 0.1 STO 02
N = 10 STO 03 XEQ "RKS" >>>>
x = 1
= R10
( in 2mn19s )
RDN y(1) = 0.439528419 = R11
y'(1) = -2.101120401 = R14
RDN z(1) = 2.070938499 = R12
z'(1) = 1.269599239 = R15
RDN u(1) = 1.744522977 = R13
u'(1) = -1.704232091 = R16
-Press R/S to continue the calculations ( after changing h &
N in registers R02 & R03 if needed )
References:
[1] J.C. Butcher - "The Numerical Analysis of Ordinary Differential
Equations" - John Wiley & Sons - ISBN 0-471-91046-5
[2] Abramowitz and Stegun - "Handbook of Mathematical Functions"
- Dover Publications - ISBN 0-486-61272-4
[3] F. Scheid - "Numerical Analysis" - Mc Graw Hill
ISBN 07-055197-9
[4] Press , Vetterling , Teukolsky , Flannery - "Numerical Recipes
in C++" - Cambridge University Press - ISBN 0-521-75033-4
Go back to the HP-41 software library
Go back to the general software library
Go
back to the main exhibit hall