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°) Functions of 1 variable
a) First & Second Derivatives
b) First & Second Derivatives - More accurate
formulae
2°) Functions of 2 variables
a) First & Second Derivatives
b) Mixed Derivative
b-1) Program#1
b-2) Program#2 - more accurate
formula
3°) Functions of 3 variables
4°) An Iterative Method
5°) Extrapolation to the limit
6°) Functions of n variables ( n < 11 )
a) First Derivatives
b) Second Derivatives
c) Iterative Method
d) Extrapolation to the limit
1°) Functions of 1 variable
a) First & Second
Derivatives
Formulae:
df/dx = (1/12h).[ f(x-2h) - 8.f(x-h) + 8.f(x+h) - f(x+2h) ] +
O(h4)
d2f/dx2 = (1/12h2).[ - f(x-2h) + 16.f(x-h)
- 30.f(x) +16.f(x+h) - f(x+2h) ] + O(h4)
-These formulas ( without + O(h4) ) are exact for any polynomial
of degree < 5
Data Registers: R00 = Function name ( Register R00 is to be initialized before executing "dF" )
R01 = x R03 = f(x)
R02 = h R04 = f
'(x) R05 = f "(x)
Flags: /
Subroutine: A program
which computes f(x) assuming x is in X-register upon entry
01 LBL "dF"
02 STO 01
03 X<>Y
04 STO 02
05 +
06 XEQ IND 00
07 STO 04
08 STO 05
09 RCL 01
10 RCL 02
11 -
12 XEQ IND 00
13 ST- 04
14 ST+ 05
15 8
16 ST* 04
17 ST+ X
18 ST* 05
19 RCL 01
20 RCL 02
21 ST+ X
22 STO 03
23 +
24 XEQ IND 00
25 ST- 04
26 ST- 05
27 RCL 01
28 RCL 03
29 -
30 XEQ IND 00
31 ST+ 04
32 ST- 05
33 RCL 01
34 XEQ IND 00
35 STO 03
36 30
37 *
38 ST- 05
39 RCL 02
40 ST/ 05
41 12
42 *
43 ST/ 04
44 ST/ 05
45 RCL 05
46 RCL 04
47 END
( 75 bytes / SIZE 007 )
STACK | INPUTS | OUTPUTS |
Y | h | f "(x) |
X | x | f '(x) |
Example: f(x) = exp(-x2) Calculate f '(1) & f "(1)
LBL "T" any
global LBL , 6 characters or less
X^2
CHS
E^X
RTN
T ASTO 00
-If we choose h = 0.03
0.03 ENTER^
1 XEQ "dF"
>>>> f '(1) =
-0.735758961 the exact values are f
'(1) = -0.735758882
X<>Y f "(1) =
0.735757408
and f "(1) = 0.735758882
-Choosing the best h-value is not easy but h ~ 0.03 "often" produces
good results.
b) First & Second Derivatives
- More Accurate Formulae
-The "Handbook of Mathematical Functions" gives many formulas ( table
25.2 ) , up to order 6
-But we can also build formulas of higher order and the following program
uses formulas of order 10:
df/dx = (1/2520.h).[ 2100.(
f1 - f-1 ) - 600.( f2 - f-2 )
+ 150.( f3 - f-3 ) - 25.( f4 -
f-4 ) + 2.( f5 - f-5 ) ] + O(h10)
d2f/dx2 =
(1/25200.h2).[ -73766 f0 + 42000.( f1 +
f-1 ) - 6000.( f2 + f-2 ) + 1000.(
f3 + f-3 ) - 125.( f4 + f-4 )
+ 8.( f5 + f-5 ) ] + O(h10)
-These are exact for any polynomial of degree < 11
( f(x+k.h) is denoted fk to simplify these expressions )
Data Registers: R00 = Function name ( Register R00 is to be initialized before executing "dF+" )
R01 = x R03 = f(x)
R02 = h R04 = f
'(x) R05 = f "(x)
Flags: /
Subroutine: A program
which computes f(x) assuming x is in X-register upon entry
01 LBL "dF+"
02 STO 01
03 X<>Y
04 STO 02
05 +
06 XEQ IND 00
07 STO 04
08 STO 05
09 RCL 01
10 RCL 02
11 -
12 XEQ IND 00
13 ST- 04
14 ST+ 05
15 42
16 ST* 05
17 ST+ X
18 ST* 04
19 RCL 01
20 RCL 02
21 ST+ X
22 +
23 XEQ IND 00
24 STO 03
25 RCL 01
26 RCL 02
27 ST+ X
28 -
29 XEQ IND 00
30 STO Y
31 RCL 03
32 -
33 24
34 *
35 ST+ 04
36 X<> 03
37 +
38 6
39 *
40 ST- 05
41 RCL 01
42 RCL 02
43 3
44 *
45 +
46 XEQ IND 00
47 STO 03
48 ST+ 05
49 RCL 01
50 RCL 02
51 3
52 *
53 -
54 XEQ IND 00
55 ST+ 05
56 RCL 03
57 -
58 6
59 *
60 ST- 04
61 RCL 01
62 RCL 02
63 4
64 *
65 +
66 XEQ IND 00
67 STO 03
68 ST- 04
69 RCL 01
70 RCL 02
71 4
72 *
73 -
74 XEQ IND 00
75 ST+ 04
76 RCL 03
77 +
78 8
79 /
80 ST- 05
81 25
82 ST* 04
83 E3
84 ST* 05
85 RCL 01
86 RCL 02
87 5
88 *
89 +
90 XEQ IND 00
91 STO 03
92 ST+ X
93 ST+ 04
94 RCL 01
95 RCL 02
96 5
97 *
98 -
99 XEQ IND 00
100 ST- 04
101 ST- 04
102 RCL 03
103 +
104 8
105 *
106 ST+ 05
107 RCL 01
108 XEQ IND 00
109 STO 03
110 73766
111 *
112 ST- 05
113 RCL 02
114 ST/ 05
115 2520
116 *
117 ST/ 04
118 10
119 *
120 ST/ 05
121 RCL 05
122 RCL 04
123 END
( 182 bytes / SIZE 006 )
STACK | INPUTS | OUTPUTS |
Y | h | f "(x) |
X | x | f '(x) |
Example: f(x) =
exp(-x2) Calculate f '(1) & f "(1)
LBL "T"
X^2
CHS
E^X
RTN
T ASTO 00
-If we choose h = 0.1
0.1 ENTER^
1 XEQ "dF+"
>>>> f '(1) = -0.735758886 (
the exact values are f '(1) = -0.735758882
X<>Y f "(1) =
0.735758849
and f "(1) = 0.735758882 )
h ~ 0.1 "often" produces very good
results for the first derivative ( 8 or 9 digit accuracy ), a little less
good for the second derivative.
Note: "dF" or "dF+" can be used to compute the
radius of curvature of a curve defined by y = f(x). For instance
01 LBL "RHO"
02 XEQ "dF+"
03 X^2
04 1
05 +
06 ENTER^
07 SQRT
08 *
09 X<>Y
10 /
11 ABS
12 END
-With y = exp(-x2) and x = 1 , it
yields: rho = 2.600834159 ( exact rho =
2.600834029 )
2°) Functions of 2 variables
a) First & Second
Derivatives
-"dF2" calls "dF+" or "dF" to compute the 4 partial derivatives f
'x = ¶f /
¶x ; f 'y =
¶f / ¶y ;
f "xx = ¶2f /
¶x2 ; f "yy =
¶2f /
¶y2
Data Registers: R00 = Function name ( Register R00 is to be initialized before executing "dF2" )
R01 = x R03 =
h R05 =
f 'x = ¶f /
¶x
R07 = f "xx = ¶2f /
¶x2
R02 = y R04 =
f(x,y) R06 = f 'y =
¶f /
¶y
R08 = f "yy = ¶2f /
¶y2
R09 & R10: temp
Flags: /
Subroutines: "dF+" or "dF" and a program
which computes f(x,y) assuming x is in X-register and y is in Y-register
upon entry.
01 LBL "dF2"
02 STO 07
03 RDN
04 STO 09
05 RCL 00
06 STO 10
07 "Y"
08 ASTO 00
09 RDN
10 XEQ "dF+"
or XEQ "dF"
11 STO 06
12 X<>Y
13 STO 08
14 "X"
15 ASTO 00
16 RCL 02
17 RCL 07
18 XEQ "dF+"
or XEQ "dF"
19 STO 05
20 X<>Y
21 STO 07
22 RCL 10
23 STO 00
24 RCL 09
25 X<> 02
26 X<> 03
27 STO 04
28 RCL 08
29 RCL 07
30 RCL 06
31 RCL 05
32 CLA
33 RTN
34 LBL "X"
35 RCL 09
36 X<>Y
37 GTO IND 10
38 LBL "Y"
39 RCL 07
40 GTO IND 10
41 END
( 73 bytes / SIZE 011 )
STACK | INPUTS | OUTPUTS |
T | / | f "yy = ¶2f / ¶y2 |
Z | h | f "xx = ¶2f / ¶x2 |
Y | y | f 'y = ¶f / ¶y |
X | x | f 'x = ¶f / ¶x |
Example: f(x) = exp(-x2).Ln(y) x = 1 , y = 2
LBL "T"
X^2
CHS
E^X
X<>Y
LN
*
RTN
T ASTO 00
-If we choose h = 0.1
0.1 ENTER^
2 ENTER^
1 XEQ "dF2"
>>>> f 'x =
¶f /
¶x =
-0.509989198
-0.509989195
RDN f 'y = ¶f
/ ¶y =
0.183939720 the exact results
are 0.183939721
RDN f "xx =
¶2f /
¶x2 =
0.509989206
0.509989195
RDN f "yy =
¶2f /
¶y2 =
-0.091969921
-0.091969860
-Whence Laplacian ( f ) =
¶2f /
¶x2 +
¶2f /
¶y2 =
0.418019286 ( exact value = 0.418019335 )
-In this example, execution time = 29 seconds
-Of course, the results are not so accurate if you use "dF" instead of "dF+"
b) Mixed Derivative
b-1)
Program#1
-The following routine employs a method of order 4
f "xy = ¶2f / ¶x¶y = (1/24.h2).[ 30 f00 + 16.( f11 + f -1-1 - f10 - f -10 - f01 - f0-1 ) + ( - f 22 - f -2-2 + f20 + f -20 + f02 + f0-2 ) ] + O(h4)
-This formula is exact for any polynomial of degree <
5
( fkm denotes f ( x + k.h , y + m.h )
)
Data Registers: R00 = Function name ( Register R00 is to be initialized before executing "MDV" )
R01 = x R04 = f(x,y)
R02 = y R05 = f "xy
= ¶2f /
¶x¶y
R06: temp
R03 = h
Flags: /
Subroutine:
A program which computes f(x,y) assuming x is in X-register and y is in
Y-register upon entry.
01 LBL "MDV"
02 STO 01
03 RDN
04 STO 02
05 X<>Y
06 STO 03
07 CLX
08 STO 06
09 XEQ 01
10 16
11 *
12 STO 05
13 XEQ 01
14 ST- 05
15 RCL 02
16 RCL 01
17 XEQ IND 00
18 STO 04
19 30
20 *
21 RCL 05
22 +
23 24
24 RCL 03
25 X^2
26 *
27 /
28 STO 05
29 RTN
30 LBL 01
31 RCL 03
32 ST+ 06
33 RCL 02
34 RCL 01
35 RCL 06
36 +
37 XEQ IND 00
38 STO 04
39 RCL 02
40 RCL 01
41 RCL 06
42 -
43 XEQ IND 00
44 ST+ 04
45 RCL 02
46 RCL 06
47 +
48 RCL 01
49 XEQ IND 00
50 ST+ 04
51 RCL 02
52 RCL 06
53 -
54 RCL 01
55 XEQ IND 00
56 ST+ 04
57 RCL 02
58 RCL 01
59 RCL 06
60 ST+ Z
61 +
62 XEQ IND 00
63 ST- 04
64 RCL 02
65 RCL 01
66 RCL 06
67 ST- Z
68 -
69 XEQ IND 00
70 RCL 04
71 -
72 END
( 102 bytes / SIZE 007 )
STACK | INPUTS | OUTPUTS |
Z | h | / |
Y | y | / |
X | x | f "xy = ¶2f / ¶x¶y |
Example: f(x) = exp(-x2).Ln(y) x = 1 , y = 2
LBL "T"
X^2
CHS
E^X
X<>Y
LN
*
RTN
T ASTO 00
-If we choose h = 0.03
0.03 ENTER^
2 ENTER^
1 XEQ "MDV"
>>>> f "xy =
¶2f /
¶x¶y =
-0.367879722 ( exact value = -1/e =
-0.367879441 )
b-2) Program#2
- more accurate formula
-Like "dF+" , "MDV+" uses a method of order 10:
f "xy =
¶2f /
¶x¶y =
(1/50400.h2).[ 73766 f00 + 42000.( f11 +
f -1-1 - f10 - f -10 - f01 -
f0-1 ) + 6000.( - f 22 - f -2-2 +
f20 + f -20 + f02 + f0-2 )
+ 1000.( f33 + f -3-3 - f30 - f -30
- f03 - f0-3 ) + 125.( - f 44 - f
-4-4 + f40 + f -40 + f04 +
f0-4 )
+ 8.( f55 + f -5-5 - f50 - f -50
- f05 - f0-5 ) ] + O(h10)
-This formula is exact for any polynomial of degree <
11
( fkm = f ( x + k.h , y + m.h ) )
Data Registers: R00 = Function name ( Register R00 is to be initialized before executing "MDV+" )
R01 = x R04 = f(x,y)
R02 = y R05 = f "xy
= ¶2f /
¶x¶y
R06: temp
R03 = h
Flags: /
Subroutine:
A program which computes f(x,y) assuming x is in X-register and y is in
Y-register upon entry.
01 LBL "MDV+"
02 STO 01
03 RDN
04 STO 02
05 X<>Y
06 STO 03
07 CLX
08 STO 06
09 XEQ 01
10 42
11 *
12 STO 05
13 XEQ 01
14 6
15 *
16 ST- 05
17 XEQ 01
18 ST+ 05
19 XEQ 01
20 8
21 /
22 ST- 05
23 E3
24 ST* 05
25 XEQ 01
26 8
27 *
28 ST+ 05
29 RCL 02
30 RCL 01
31 XEQ IND 00
32 STO 04
33 73766
34 *
35 RCL 05
36 +
37 50400
38 RCL 03
39 X^2
40 *
41 /
42 STO 05
43 RTN
44 LBL 01
45 RCL 03
46 ST+ 06
47 RCL 02
48 RCL 01
49 RCL 06
50 +
51 XEQ IND 00
52 STO 04
53 RCL 02
54 RCL 01
55 RCL 06
56 -
57 XEQ IND 00
58 ST+ 04
59 RCL 02
60 RCL 06
61 +
62 RCL 01
63 XEQ IND 00
64 ST+ 04
65 RCL 02
66 RCL 06
67 -
68 RCL 01
69 XEQ IND 00
70 ST+ 04
71 RCL 02
72 RCL 01
73 RCL 06
74 ST+ Z
75 +
76 XEQ IND 00
77 ST- 04
78 RCL 02
79 RCL 01
80 RCL 06
81 ST- Z
82 -
83 XEQ IND 00
84 RCL 04
85 -
86 END
( 134 bytes / SIZE 007 )
STACK | INPUTS | OUTPUTS |
Z | h | / |
Y | y | / |
X | x | f "xy = ¶2f / ¶x¶y |
Example: f(x) = exp(-x2).Ln(y) x = 1 , y = 2
LBL "T"
X^2
CHS
E^X
X<>Y
LN
*
RTN
T ASTO 00
-If we choose h = 0.1
0.1 ENTER^
2 ENTER^
1 XEQ "MDV+"
>>>> f "xy =
¶2f /
¶x¶y =
-0.367879484 ( exact value = -1/e =
-0.367879441 )
-In this example, execution time = 29 seconds
-The formula requires 31 evaluations of the function.
3°) Functions of 3 variables
-"dF3" calls "dF+" or "dF" to compute the 6 partial derivatives f
'x = ¶f /
¶x ; f 'y =
¶f / ¶y ;
f 'z = ¶f /
¶z ; f "xx =
¶2f /
¶x2 ; f "yy =
¶2f /
¶y2 ; f "zz =
¶2f /
¶z2
Data Registers: R00 = Function name ( Register R00 is to be initialized before executing "dF3" )
R01 = x R04 =
h
R06 = f 'x = ¶f /
¶x
R09 = f "xx = ¶2f /
¶x2
R02 = y R05 =
f(x,y,z) R07 = f 'y =
¶f /
¶y
R10 = f "yy = ¶2f /
¶y2
R12 & R13: temp
R03 =
z
R08 = f 'z = ¶f /
¶z
R11 = f "zz = ¶2f /
¶z2
Flags: /
Subroutines: "dF+" or "dF" and a program
which computes f(x,y,z) assuming x is in X-register, y is in Y-register and
z is in Z-register upon entry.
01 LBL "dF3"
02 STO 06
03 RDN
04 STO 09
05 RDN
06 STO 12
07 RCL 00
08 STO 13
09 "Z"
10 ASTO 00
11 RDN
12 XEQ "dF+"
or XEQ "dF"
13 STO 08
14 X<>Y
15 STO 11
16 "Y"
17 ASTO 00
18 RCL 02
19 RCL 09
20 XEQ "dF+"
or XEQ "dF"
21 STO 07
22 X<>Y
23 STO 10
24 "X"
25 ASTO 00
26 RCL 02
27 RCL 06
28 XEQ "dF+"
or XEQ "dF"
29 STO 06
30 X<>Y
31 X<> 09
32 X<> 02
33 STO 04
34 RCL 12
35 X<> 03
36 STO 05
37 RCL 13
38 STO 00
39 RCL 09
40 RCL 10
41 RCL 11
42 +
43 +
44 RCL 08
45 RCL 07
46 RCL 06
47 CLA
48 RTN
49 LBL "X"
50 RCL 09
51 RCL 12
52 X<> Z
53 GTO IND 13
54 LBL "Y"
55 RCL 12
56 X<>Y
57 RCL 06
58 GTO IND 13
59 LBL "Z"
60 RCL 09
61 RCL 06
62 GTO IND 13
63 END
( 108 bytes / SIZE 014 )
STACK | INPUTS | OUTPUTS |
T | h | Df |
Z | z | f 'z = ¶f / ¶z |
Y | y | f 'y = ¶f / ¶y |
X | x | f 'x = ¶f / ¶x |
where Df = Laplacian ( f ) = ¶2f / ¶x2 + ¶2f / ¶y2 + ¶2f / ¶z2
Example: f(x) = exp(-x2).Ln(y2+z) x = 1 , y = 2 , z = 3
LBL "T"
X^2
CHS
E^X
RDN
X^2
+
LN
R^
*
RTN
T ASTO 00
-If we choose h = 0.1
0.1 ENTER^
3 ENTER^
2 ENTER^
1 XEQ "dF3"
>>>> f 'x =
¶f /
¶x =
-1.413720683
and R09 = f "xx =
¶2f /
¶x2 = 1.413720635
RDN f 'y = ¶f
/ ¶y =
0.210216822
R10 = f "yy = ¶2f /
¶y2 = -0.015015516
RDN f 'z = ¶f
/ ¶z =
0.052554204
R11 = f "zz =
¶2f /
¶z2 = -0.007507659
RDN
¶2f /
¶x2 +
¶2f /
¶y2 +
¶2f /
¶z2 =
1.409197460
-In this example, execution time = 50 seconds
4°) An Iterative Method
-The following program computes a derivative d with an initial
h0-value and one of our formulas above
-Then, the calculation is performed again with h1 =
h0/sqrt(2) ( lines 12-13 )
-The iteration continues ( with hi+1 = hi/sqrt(2) )
until the difference | di+1 - di | is no more
decreasing or (di) is no more
monotonic.
[ di = d(hi) ]
-In other words, the iteration stops when the relation 0 <= (
di+1 - di ) / ( di - di-1 ) <
1 is no more satisfied.
-This relation is given in the PPC ROM user's manual.
-Actually, I've remarked that this test could stop the routine prematurely
- for instance in example 1 - so I've replaced this "< 1" above by "<
1.1" ( line 34 )
-Another value might be better.
-The result is the next to last di and |
di+1 - di | is used as an error estimate
Data Registers: R00 = function name R20 = derivative name ( Registers R00 & R20 are to be initialized before executing "DRV" )
function of 1 variable: R01 =
x R02 =
h
R19 = 2 , 3 or 4
function of 2 variables: R01 =
x R02 = y R03 =
h
R21 = di R22 = di+1
function of 3 variables: R01 =
x R02 = y R03 = z R04
= h
Flags: F10
- Set flag F02 for a function of 2
variables
( Clear flags F02 & F03 for a function of 1 variable )
Set flag F03 for a function of 3 variables
Subroutines: A program which computes
f(x) [ or f(x,y) or f(x,y,z) ] assuming x is in
X-register [ y in Y-register , z in Z-register ] upon entry
and a routine like "dF" , "dF+" , "dF2" , "dF3" , "MDV" ... etc ... which
computes the required derivative with the same inputs as "DRV"
01 LBL "DRV"
02 XEQ IND 20
03 STO 21
04 2
05 FS? 02
06 3
07 FS? 03
08 4
09 STO 19
10 SF 10
11 LBL 01
12 2
13 SQRT
14 ST/ IND 19
15 RCL 04
16 RCL 03
17 RCL 02
18 RCL 01
19 XEQ IND 20
20 ENTER^
21 X<> 22
22 FS?C 10
23 GTO 01
24 VIEW X
25 ST- Y
26 ENTER^
27 X<> 21
28 -
29 X=0?
30 GTO 02
31 /
32 X<0?
33 GTO 02
34
1.1
or another number slighly greater than 1
35 X>Y?
36 GTO 01
37 LBL 02
38 2
39 SQRT
40 ST* IND 19
41 RCL 22
42 RCL 21
43 -
44 ABS
45 RCL 21
46 END
( 77 bytes / SIZE 023 )
STACK | INPUTS1 | INPUTS2 | INPUTS3 | OUTPUTS |
T | / | / | h0 | / |
Z | / | h0 | z | / |
Y | h0 | y | y | error estimate |
X | x | x | x | derivative |
INPUTS1 for a function of 1 variable
INPUTS2 for a function of 2 variables
INPUTS3 for a function of 3 variables
Example1: f(x) = exp(-x2) evaluate f "(1)
LBL "T"
X^2
CHS
E^X
RTN
"T" ASTO 00
LBL "D2"
XEQ "dF+"
X<>Y
RTN
"D2" ASTO 20
-With h0 = 0.3
CF 02 CF 03
0.3 ENTER^
1 XEQ "DRV"
>>>> the successive approximations are displayed ( except
the first one ) and eventually,
f "(1) = 0.735758869
X<>Y error estimate = 70
E-9
the error is actually 13 E-9 only ( in absolute value )
Example2: f(x) = exp(-x2).Ln(y) x = 1 , y = 2 evaluate f "xy = ¶2f / ¶x¶y
LBL "T"
X^2
CHS
E^X
X<>Y
LN
*
RTN
"T" ASTO 00 "MDV+" ASTO 20
-With h0 = 0.3
SF 02 CF 03
0.3 ENTER^
2 ENTER^
1 XEQ "DRV"
>>>> the successive approximations are displayed and
eventually,
f "xy = ¶2f /
¶x¶y
= -0.367879435
X<>Y error estimate = 35
E-9
the error is in fact 7 E-9
Example3: f(x) = exp(-x2).Ln(y2+z) x = 1 , y = 2 , z = 3 Evaluate Df = Laplacian ( f ) = ¶2f / ¶x2 + ¶2f / ¶y2 + ¶2f / ¶z2
LBL "T"
X^2
CHS
E^X
RDN
X^2
+
LN
R^
*
RTN
"T" ASTO 00
LBL "D3"
XEQ "dF3"
R^
RTN
"D3" ASTO 00
-With h0 = 0.3
CF 02 SF 03
0.3 ENTER^
3 ENTER^
2 ENTER^
1 XEQ "DRV"
>>>> the successive approximations are displayed and
eventually,
Df = Laplacian ( f ) =
¶2f /
¶x2 +
¶2f /
¶y2 +
¶2f /
¶z2 =
1.409197493 ( exact value = 1.409197445 )
X<>Y error estimate = 105 E-9 which is too pessimistic!
Notes:
-Do not choose a too small h0-value.
-The results are not always so good, especially for expressions like a Laplacian,
because the optimal h-value for a partial derivative with respect to x
is not necessarily optimal for a partial derivative with respect to
y or z!
5°) Extrapolation to the Limit
-Using high-order formulae requires many evaluations of the function and
this may be time consuming for complicated functions, especially with "DRV".
-The following routine employs simpler formulas of order 2 and an extrapolation
to the limit
-The method is quite similar to the Romberg integration
-Like "DRV", "DRV2" calculates a derivative d with an initial
h0-value:
a00 = d(h0) = d0
-Then, the calculation is performed again with h1 =
h0/µ
a10 = d(h1)
-But here, we use these 2 results to compute an estimation of higher
order: a11 = (
µ2 a10 - a00 ) / ( µ2
- 1 ) = d1
-Thus, we build the following
array: a00
= d(h0) = d0
a10 =
d(h0/µ)
a11 = ( µ2 a10 - a00 ) /
( µ2 - 1 ) = d1
a20 =
d(h0/µ2)
a21 = ( µ2 a20 - a10 ) /
( µ2 - 1
)
a22 = ( µ4 a21 - a11 ) /
( µ4 - 1 ) = d2
.................................................................. and so on ...............................................................................
-In the following routine, µ = sqrt(2) ( line 11-12 )
-The program stops when the difference | di+1 - di
| is no more decreasing.
-The result is the next to last di and |
di+1 - di | is used as an error estimate.
Data Registers: R00 = function name R10 = derivative name ( Registers R00 & R10 are to be initialized before executing "DRV2" )
function of 1 variable R01 =
x R02 =
h
R09 = 2 , 3 or 4
function of 2 variables R01 =
x R02 = y R03 =
h
R11 = di R12 = | di+1 - di |
function of 3 variables R01 =
x R02 = y R03 = z R04
=
h
R13 = µ R14 = counter R15 = 1 ,
µ2 , µ4 , µ6 , .....
Registers R05 thru R08 are
unused
R16 = ai0 R17 = ai1 R18 = ai2
... etc ...
Flags:
Set flag F02 for a function of 2
variables
( Clear these 2 flags for a function of 1 variable )
Set flag F03 for a function of 3 variables
Subroutines: A program which computes
f(x) [ or f(x,y) or f(x,y,z) ] assuming x is in
X-register [ y in Y-register , z in Z-register ] upon entry
and a routine which computes the required derivative by a formula of the
kind d = ...... + O(h2)
and uses the data in registers R01 R02 R03 R04
-Such formulas and subroutines are listed below.
01 LBL "DRV2"
02 STO 01
03 RDN
04 STO 02
05 RDN
06 STO 03
07 X<>Y
08 STO 04
09 E99
10 STO 12
11 2
12 SQRT
13 STO 13
14 16
15 STO 14
16 2
17 FS? 02
18 3
19 FS? 03
20 4
21 STO 09
22 XEQ IND 10
23 STO 16
24 LBL 01
25 RCL 13
26 ST/ IND 09
27 RCL 14
28 INT
29 E3
30 /
31 16
32 +
33 STO 14
34 SIGN
35 STO 15
36 XEQ IND 10
37 LBL 02
38 RCL 15
39 RCL 13
40 ENTER^
41 *
42 *
43 STO 15
44 *
45 X<>Y
46 X<> IND 14
47 STO 11
48 -
49 RCL 15
50 1
51 -
52 /
53 ISG 14
54 GTO 02
55 STO IND 14
56 RCL 11
57 -
58 ABS
59 ENTER^
60 X<> 12
61 X>Y?
62 GTO 01
63 CLX
64 RCL 11
65 END
( 91 bytes )
STACK | INPUTS1 | INPUTS2 | INPUTS3 | OUTPUTS |
T | / | / | h0 | / |
Z | / | h0 | z | / |
Y | h0 | y | y | error estimate |
X | x | x | x | derivative |
INPUTS1 for a function of 1 variable
INPUTS2 for a function of 2 variables
INPUTS3 for a function of 3 variables
Example: f(x) = exp(-x2) evaluate f '(1)
LBL "T"
X^2
CHS
E^X
RTN
"T" ASTO 00
-For the first derivative, we can use the very simple formula f '(x) = [ f(x+h) - f(x-h) ] / 2.h
LBL
"DR1" STO
03
RCL 03 RTN
RCL
01
RCL
01
-
RCL
02
RCL
02
RCL 02
-
+
ST+ X
XEQ IND 00 XEQ IND
00
/
"DR1" ASTO 10
-With h0 = 0.1
CF 02 CF 03
0.1 ENTER^
1 XEQ "DRV2"
>>>> f '(1) = -0.735758876
X<>Y error estimate = 49
E-9
the error is actually 7 E-9
-Do not choose too small h0-values.
-The method is sometimes very disappointing for complex expressions like
a Laplacian: Calculate the partial derivatives separately and add these results.
-Here are a few formulas and subroutines needed by "DRV2"
Miscellaneous Formulas of order 2
1°) Functions of 1 variable
a) First derivative: f '(x) = [ f(x+h) - f(x-h) ] / 2.h + O(h2)
LBL
"DR1"
STO
03
RCL 03 RTN
RCL
01
RCL
01
-
RCL
02
RCL
02
RCL 02
-
+
ST+ X
XEQ IND 00 XEQ IND
00 /
b) Second derivative: f "(x) = [ f(x+h) - 2.f(x) + f(x-h) ] / h2 + O(h2)
LBL
"DR2" STO
03
RCL
01
+
RCL
01
RCL
01
RCL
02
RCL 02
RCL
02
XEQ IND 00
-
X^2
+
ST+
X
XEQ IND 00 /
XEQ IND 00 ST-
03
RCL
03
RTN
2°) Functions of 2 variables
a) First derivative: fx '(x,y) = ¶f / ¶x = [ f(x+h,y) - f(x-h,y) ] / 2.h + O(h2)
LBL "DRX" XEQ IND
00
+
ST+ X
RCL
02
STO
04
XEQ IND 00 /
RCL
01
RCL
02
RCL
04
RTN
RCL
03
RCL
01
-
-
RCL
03
RCL 03
b) First derivative: fy '(x,y) = ¶f / ¶y = [ f(x,y+h) - f(x,y-h) ] / 2.h + O(h2)
LBL "DRY" XEQ IND
00 RCL
01
ST+ X
RCL
02
STO
04
XEQ IND 00 /
RCL
03
RCL
02
RCL
04
RTN
-
RCL
03
-
RCL
01
+
RCL 03
c) Second derivative: fxx "(x,y) = ¶2f / ¶x2 = [ f(x+h,y) - 2.f(x,y) + f(x-h,y) ] / h2 + O(h2)
LBL "DRXX" XEQ IND
00 ST+
X
-
X^2
RCL
02
STO
04
ST-
04
XEQ IND 00 /
RCL
01
RCL
02
RCL
02
RCL
04
RTN
RCL
03
RCL
01
RCL
01
+
+
XEQ IND 00 RCL
03
RCL 03
d) Second derivative: fyy "(x,y) = ¶2f / ¶y2 = [ f(x,y+h) - 2.f(x,y) + f(x,y-h) ] / h2 + O(h2)
LBL "DRYY" XEQ IND
00 ST+
X
RCL
01
X^2
RCL
02
STO
04
ST-
04
XEQ IND 00 /
RCL
03
RCL
02
RCL
02
RCL
04
RTN
+
RCL
01
RCL
03
+
RCL
01
XEQ IND 00
-
RCL 03
e) Mixed derivative: fxy "(x,y) = ¶2f / ¶x¶y = [ f(x+h,y+h) - f(x+h,y-h) - f(x-h,y+h) + f(x-h,y-h) ] / 4.h2+ O(h2)
LBL "DRXY"
+
RCL
03
RCL 02 XEQ IND
00 ST-
Z
RCL 03
RCL
02
XEQ IND 00 ST+
Z
RCL
01 ST-
04
-
ST+ X
RCL
01
STO
04
-
RCL
03 RCL
02
XEQ IND 00 X^2
RCL
03
RCL
02
XEQ IND 00 ST+
Z
RCL
01
RCL
04
/
ST-
Z
RCL
01
ST+
04
+
RCL
03
-
RTN
f) Laplacian: fxx "(x,y) + fyy "(x,y) = ¶2f / ¶x2 + ¶2f / ¶y2 = [ f(x+h,y) + f(x,y+h) - 4.f(x,y) + f(x-h,y) + f(x,y-h) ] / h2 + O(h2)
LBL "LAP2" XEQ IND
00 RCL
01
XEQ IND 00 RCL
01
RCL
02
RCL
04
RTN
RCL
02
STO
04
XEQ IND 00
4
RCL
03
RCL
03
+
RCL
01
RCL
02
ST+
04
*
-
-
RCL 03
RCL
03
RCL
03
RCL
02
ST-
04
XEQ IND 00 RCL
01
X^2
+
+
RCL
01
RCL
02
ST+
04
XEQ IND
00 /
3°) Functions of 3 variables
a) First derivative: fx '(x,y,z) = ¶f / ¶x = [ f(x+h,y,z) - f(x-h,y,z) ] / 2.h + O(h2)
LBL "DR3X"
-
RCL
01
-
RCL
03
XEQ IND 00 RCL
04
RCL 04
RCL
02
STO
05
+
ST+ X
RCL
01
RCL
03
XEQ IND
00
/
RCL
04
RCL
02
RCL
05
RTN
b) First derivative: fy '(x,y,z) = ¶f / ¶y = [ f(x,y+h,z) - f(x,y-h,z) ] / 2.h + O(h2)
LBL "DR3Y" RCL
01
RCL
04
-
RCL
03
XEQ IND 00
+
RCL 04
RCL
02
STO
05
RCL
01
ST+ X
RCL
04
RCL
03
XEQ IND
00
/
-
RCL
02
RCL
05
RTN
c) First derivative: fz '(x,y,z) = ¶f / ¶y = [ f(x,y,z+h) - f(x,y,z-h) ] / 2.h + O(h2)
LBL "DR3Z"
-
RCL
01
-
RCL
03
XEQ IND 00 RCL
04
RCL 04
RCL
02
STO
05
+
ST+ X
RCL
01
RCL
03
XEQ IND
00
/
RCL
04
RCL
02
RCL
05
RTN
d) Second derivative: fxx "(x,y,z) = ¶2f / ¶x2 = [ f(x+h,y,z) - 2.f(x,y,z) + f(x-h,y,z) ] / h2 + O(h2)
LBL "DR3XX"
+
RCL
01
RCL
02
RCL
05 RTN
RCL
03
XEQ IND 00 XEQ
IND
00 RCL
01
+
RCL
02
STO
05
ST+
X
RCL
04
RCL 04
RCL
01
RCL
03
ST-
05
-
X^2
RCL
04
RCL
02
RCL
03
XEQ IND 00 /
e) Second derivative: fyy "(x,y,z) = ¶2f / ¶y2 = [ f(x,y+h,z) - 2.f(x,y,z) + f(x,y-h,z) ] / h2 + O(h2)
LBL "DR3XX" RCL
01
RCL
01
RCL
02
RCL
05 RTN
RCL
03
XEQ IND 00 XEQ
IND
00 RCL
04
+
RCL
02
STO
05
ST+
X
-
RCL 04
RCL
04
RCL
03
ST-
05
RCL
01
X^2
+
RCL
02
RCL
03
XEQ IND 00 /
f) Second derivative: fzz "(x,y,z) = ¶2f / ¶z2 = [ f(x,y,z+h) - 2.f(x,y,z) + f(x,y,z-h) ] / h2 + O(h2)
LBL "DR3XX" RCL
01
RCL
01
RCL
04
RCL
05 RTN
RCL
03
XEQ IND 00 XEQ
IND
00
-
+
RCL
04
STO
05
ST+
X
RCL
02
RCL 04
+
RCL
03
ST-
05
RCL
01
X^2
RCL
02
RCL
02
RCL
03
XEQ IND 00 /
g) Laplacian:
fxx "(x,y) + fyy "(x,y) + fzz "(x,y,z)
= ¶2f /
¶x2 +
¶2f /
¶y2 +
¶2f /
¶z2
= [ f(x+h,y,z) + f(x,y+h,z) + f(x,y,z+h) - 6.f(x,y,z) + f(x-h,y,z) + f(x,y-h,z)
+ f(x,y,z-h) ] / h2 + O(h2)
LBL "LAP3"
+
RCL
04 RCL
03 XEQ IND 00 XEQ IND
00 RCL
02
ST+ 05 RCL
01
-
+
RCL 03 XEQ IND
00
+
RCL 04 ST+
05
6
RCL
01
RCL 03 XEQ IND 00 RCL
02 RCL 04
RCL 02 STO
05
RCL
01
+
RCL
03
*
RCL
04
RCL 02 ST+
05
RCL 01 X^2
RCL 01 RCL
03
XEQ IND 00 RCL 02 RCL
02
ST-
05
-
RCL 04 RCL
03 XEQ IND
00 /
RCL 04 RCL
02
ST+
05
RCL 01 RCL
01
RCL
03 XEQ
IND 00
-
RCL
04 RCL
05 RTN
6°) Functions of n variables ( n < 11 )
-The following routines generalize the programs above.
-They are limited to functions of 10 ( or less ) variables.
-If you want to study functions of more than 10 variables, simply shift registers
R11, R12, ... in these listings.
a) First Derivatives
Data Registers: R00 = Function
name
R01 = x1 , R02 = x2
, .......... , Rnn =
xn ( These ( n+1 ) registers
are to be initialized before executing "FD" )
R11 =
h
R13 =
i
R15 = xi
R12 = ¶f /
¶xi
R14 = 0 , h , 2h , .... R16: temp
Flags: /
Subroutine: A program which computes
f(x1, ..... ,xn) assuming x1
is in R01 , ............ , xn is in Rnn
01 LBL "FD"
02 STO 13
03 X<>Y
04 STO 11
05 CLX
06 STO 14
07 RCL IND Y
08 STO 15
09 XEQ 01
10 84
11 *
12 STO 12
13 XEQ 01
14 24
15 *
16 ST- 12
17 XEQ 01
18 6
19 *
20 ST+ 12
21 XEQ 01
22 ST- 12
23 25
24 ST* 12
25 XEQ 01
26 ST+ X
27 ST+ 12
28 RCL 11
29 2520
30 *
31 ST/ 12
32 RCL 15
33 STO IND 13
34 RCL 12
35 RTN
36 LBL 01
37 RCL 11
38 ST+ 14
39 RCL 15
40 RCL 14
41 -
42 STO IND 13
43 XEQ IND 00
44 STO 16
45 RCL 14
46 RCL 15
47 +
48 STO IND 13
49 XEQ IND 00
50 RCL 16
51 -
52 END
( 91 bytes / SIZE 017 )
STACK | INPUTS | OUTPUTS |
Y | h | / |
X | i | f 'xi = ¶f / ¶xi |
Example: f(x) = exp(-x2).Ln(y2+z) x = 1 , y = 1 , z = 1
LBL "T"
E^X
+
"T" ASTO 00
RCL 01 RCL
02
LN
1 STO 01 STO 02 STO 03
X^2
X^2
*
CHS RCL
03 RTN
-With h = 0.1
0.1 ENTER^
1 XEQ "FD"
>>>> f 'x1 =
¶f /
¶x1 =
-0.509989198 ( The last decimal should be a 5 )
0.1 ENTER^
2 XEQ "FD"
>>>> f 'x2 =
¶f /
¶x2 =
0.367879440 ( The last decimal should be a
1 )
0.1 ENTER^
3 XEQ "FD"
>>>> f 'x3 =
¶f /
¶x3 =
0.183939720 ( The last decimal should be a
1 )
-This program uses the formula of order 10 given in paragraph 1°) b)
b) Second Derivatives
Data Registers: R00 = Function
name
R01 = x1 , R02 = x2
, .......... , Rnn =
xn ( These ( n+1 ) registers
are to be initialized before executing "SD" )
R11 =
h
R13 =
i R15 =
0 , h , 2h , ....
R12 = ¶2f /
¶xi¶xj
R14 =
j R16 =
xi R17 = xj R18: temp
Flag: F10
Subroutine: A program which computes
f(x1, ..... ,xn) assuming x1
is in R01 , ............ , xn is in Rnn
01 LBL "SD"
02 CF 10
03 X=Y?
04 SF 10
05 STO 13
06 RDN
07 STO 14
08 X<>Y
09 STO 11
10 CLX
11 STO 15
12 RCL IND T
13 STO 16
14 RCL IND Z
15 STO 17
16 XEQ 01
17 42
18 *
19 STO 12
20 XEQ 01
21 6
22 *
23 ST- 12
24 XEQ 01
25 ST+ 12
26 XEQ 01
27 8
28 /
29 ST- 12
30 E3
31 ST* 12
32 XEQ 01
33 8
34 *
35 ST+ 12
36 RCL 16
37 STO IND 13
38 XEQ IND 00
39 73766
40 *
41 ST- 12
42 25200
43 FC? 10
44 ST+ X
45 FC?C 10
46 CHS
47 RCL 11
48 X^2
49 *
50 ST/ 12
51 RCL 12
52 RTN
53 LBL 01
54 RCL 11
55 ST+ 15
56 RCL 15
57 RCL 16
58 +
59 STO IND 13
60 XEQ IND 00
61 STO 18
62 RCL 16
63 RCL 15
64 -
65 STO IND 13
66 XEQ IND 00
67 ST+ 18
68 RCL 18
69 FS? 10
70 RTN
71 RCL 17
72 RCL 15
73 -
74 STO IND 14
75 XEQ IND 00
76 ST- 18
77 RCL 16
78 STO IND 13
79 XEQ IND 00
80 ST+ 18
81 RCL 15
82 RCL 17
83 +
84 STO IND 14
85 XEQ IND 00
86 ST+ 18
87 RCL 15
88 ST+ IND 13
89 XEQ IND 00
90 ST- 18
91 RCL 17
92 STO IND 14
93 RCL 18
94 END
( 169 bytes / SIZE 019 )
STACK | INPUTS | OUTPUTS |
Z | h | / |
Y | j | / |
X | i | f "xixj = ¶2f / ¶xi¶xj |
Example: f(x) = exp(-x2).Ln(y2+z) x = 1 , y = 1 , z = 1
LBL "T"
E^X
+
"T" ASTO 00
RCL 01 RCL
02
LN
1 STO 01 STO 02 STO 03
X^2
X^2
*
CHS RCL
03 RTN
-With h = 0.1
0.1 ENTER^
1 ENTER^
XEQ "SD"
>>>> f "xx =
¶2f /
¶x2 =
0.509989206 ( exact derivative = 0.509989195 )
0.1 ENTER^
1 ENTER^
2 XEQ "SD"
>>>> f "xy =
¶2f /
¶x¶y =
-0.735758889 ( the last decimal should be a 2 )
Notes:
-If i = j this program uses the formula of paragraph 1°)
b)
-If i # j ------------------------------------------- 2°)
b-2)
-Both formulas are of order 10 but the first one requires less evaluations
of the function than the second one.
-The following routine may be used to compute the Laplacian
01 LBL "LAPL"
02 STO 19
03 X<>Y
04 STO 11
05 CLX
06 STO
20
Choose another register ( like synthetic register M ) or R10 ( if n <
10 )
07 LBL
01
if you want to use "LAPL" as a subroutine of the following program "DV"
08 RCL 11
09 RCL 19
10 ENTER^
11 XEQ "SD"
12 ST+ 20
13 DSE 19
14 GTO 01
15 RCL 20
16 END
( 35 bytes / SIZE 021 )
STACK | INPUTS | OUTPUTS |
Y | h | / |
X | n | Laplacian(f) |
where n is the number of variables
Example: f(x) = exp(-x2.t).Ln(y2+z) x = 1 , y = 1 , z = 1 , t = 1
LBL "T" RCL
04
X^2
*
"T" ASTO 00
RCL 01
*
RCL 03
RTN
1 STO 01 STO 02 STO 03 STO 04
X^2
E^X +
CHS RCL
02 LN
-With h = 0.1
0.1 ENTER^
4 XEQ "LAPL"
>>>> Laplacian(f) =
¶2f /
¶x2 +
¶2f /
¶y2 +
¶2f /
¶z2 +
¶2f /
¶t2 = 0.673013929
( the last 2 decimals should be 32 )
c) Iterative Method
-This program employs the method described in §4
Data Registers: R00 = Function
name
R01 = x1 , R02 = x2
, .......... , Rnn =
xn ( These ( n+1 ) registers
and R20 are to be initialized before executing "DV" )
R11 thru R16 ( or R18 ) are used by "FD" or
"SD"
R20 = "FD" or "SD" or another similar program
R21 = dk R22 = dk+1
Flags: F09 - F10
F02: Clear flag F02 to compute a first derivative
Set flag F02 to compute a second derivative
Subroutines: "FD" or "SD"
and a program which computes f(x1, .....
,xn) assuming x1 is in R01 , ............
, xn is in Rnn
01 LBL "DV"
02 XEQ IND
20
If you plan to use "DV" with "FD" and "SD" only,
03 STO
21
add "FD" FS? 02 "SD" ASTO 20 after line 01 and register
R20 is no more to be initialized.
04 SF 09
05 LBL 01
06 RCL 11
07 2
08 SQRT
09 /
10 FS? 02
11 RCL 14
12 RCL 13
13 XEQ IND 20
14 ENTER^
15 X<> 22
16 FS?C 09
17 GTO 01
18 VIEW X
19 ST- Y
20 ENTER^
21 X<> 21
22 -
23 X=0?
24 GTO 02
25 /
26 X<0?
27 GTO 02
28 1.1
29 X>Y?
30 GTO 01
31 LBL 02
32 2
33 SQRT
34 ST* 11
35 RCL 21
36 RCL 22
37 -
38 ABS
39 RCL 21
40 END
( 67 bytes / SIZE 023 )
STACK | INPUTS1 | INPUTS2 | OUTPUTS |
Z | / | h0 | / |
Y | h0 | j | error estimate |
X | i | i | derivative |
INPUTS1 for a first derivative - in this case, derivative =
f 'xi = ¶f /
¶xi
INPUTS2 for a second derivative - in this case, derivative =
f "xixj = ¶2f /
¶xi¶xj
Example: f(x) = exp(-x2.t).Ln(y2+z) x = 1 , y = 1 , z = 1 , t = 1
LBL "T" RCL
04
X^2
*
"T" ASTO 00
RCL 01
*
RCL 03
RTN
1 STO 01 STO 02 STO 03 STO 04
X^2
E^X +
CHS RCL
02 LN
-With h0 = 0.2
CF 02 "FD" ASTO 20
0.2 ENTER^
4 XEQ "DV"
>>>> the successive approximations are displayed ( except the
first one ) and eventually,
f 't = ¶f /
¶t = -0.254994598 ( the last decimal
should be a 7 )
X<>Y errror estimate = E-9
SF 02 "SD" ASTO 20
0.2 ENTER^
1 ENTER^
3
R/S >>>> the successive approximations
are displayed and finally,
f "xz = ¶2f /
¶x¶z =
-0.367879443 ( the last decimal should be a 1 )
X<>Y errror estimate = 80 E-9 which is too pessimistic!
d) Extrapolation to the
Limit
-This program employs the method described in §5
Data Registers: R00 = Function
name
R01 = x1 , R02 = x2
, .......... , Rnn =
xn ( These ( n+1 ) registers
and R20 are to be initialized before executing "DV2" )
R11 thru R14 ( or R16 ) are used by "FD2" or "SD2" R20 = "FD2" or "SD2" or the name of another similar program
R21 =
dk
R24 = 26.0....
R22 = | dk+1 - dk
| R25 = 1 , µ2 ,
µ4 , µ6 , .....
R23 = µ = sqrt(2) R26
= ai0 R27 = ai1 R28 = ai2 ...
etc ...
Flags: F02: Clear flag
F02 to compute a first derivative
Set flag F02 to compute a second derivative
Subroutines: "FD2" or "SD2" which are listed at
the bottom of this page
and a program which computes f(x1, .....
,xn) assuming x1 is in R01 , ............
, xn is in Rnn
01 LBL "DV2"
02 XEQ IND 20
03 STO 26
04 E99
05 STO 22
06 2
07 SQRT
08 STO 23
09 26
10 STO 24
11 LBL 01
12 RCL 24
13 INT
14 E3
15 /
16 26
17 +
18 STO 24
19 SIGN
20 STO 25
21 RCL 11
22 RCL 23
23 /
24 FS? 02
25 RCL 14
26 RCL 13
27 XEQ IND 20
28 LBL 02
29 RCL 25
30 RCL 23
31 ENTER^
32 *
33 *
34 STO 25
35 *
36 X<>Y
37 X<> IND 24
38 STO 21
39 -
40 RCL 25
41 1
42 -
43 /
44 ISG 24
45 GTO 02
46 STO IND 24
47 RCL 21
48 -
49 ABS
50 ENTER^
51 X<> 22
52 X>Y?
53 GTO 01
54 CLX
55 RCL 21
56 END
( 93 bytes / SIZE 027+ ? )
STACK | INPUTS1 | INPUTS2 | OUTPUTS |
Z | / | h0 | / |
Y | h0 | j | error estimate |
X | i | i | derivative |
INPUTS1 for a first derivative - in this case, derivative =
f 'xi = ¶f /
¶xi
INPUTS2 for a second derivative - in this case, derivative =
f "xixj = ¶2f /
¶xi¶xj
Example: f(x) = exp(-x2.t).Ln(y2+z) x = 1 , y = 1 , z = 1 , t = 1
LBL "T" RCL
04
X^2
*
"T" ASTO 00
RCL 01
*
RCL 03
RTN
1 STO 01 STO 02 STO 03 STO 04
X^2
E^X +
CHS RCL
02 LN
-With h0 = 0.1
CF 02 "FD2" ASTO 20 ( 1st derivative: load the subroutine "FD2" listed hereafter )
0.1 ENTER^
4 XEQ "DV2"
>>>> f 't =
¶f / ¶t =
-0.254994598 ( the last decimal should be a 7 )
X<>Y errror estimate = 3 E-9
SF 02 "SD2" ASTO 20 ( 2nd derivative: load the subroutine "SD2" listed hereafter )
0.1 ENTER^
1 ENTER^
R/S >>>> f "xx =
¶2f /
¶x2 = -0.509989079 ( the
last 3 decimals should be 195 )
X<>Y errror estimate = 33 E-9 which is too optimistic!
0.1 ENTER^
1 ENTER^
3
R/S >>>> f "xz
= ¶2f /
¶x¶z =
-0.367879423 ( the last 2 decimals should be 41 )
X<>Y errror estimate = 61 E-9
a) First derivatives
LBL "FD2" RCL IND Y
XEQ IND 00
+
-
RCL 11 RTN
STO 13 STO
14 STO
12
STO IND 13 RCL
14
ST+ X
X<>Y
X<>Y
RCL
11
XEQ IND 00 STO IND
13 /
STO 11 ST- IND
13 RCL
14
RCL
12
CLX
STO 12
b) Second derivatives
LBL "SD2" STO
11
ST+ IND 13 XEQ IND
00 RCL
11
4
RCL
11
XEQ IND 00 /
CF
10 RCL
IND T ST+ IND
14 ST-
12
RCL
16
ST/
12
ST+ IND
13 ST+
12
STO 12
X=Y? STO
15
XEQ IND 00 RCL
15
+
GTO
02
XEQ IND 00 LBL
02
END
SF
10 RCL
IND Z STO
12
RCL
11
STO IND 14 LBL
01
ST+
12
RCL 15
STO 13 STO
16
RCL
16
-
XEQ IND 00 XEQ IND
00 RCL
15
STO IND 13
RDN
FS?C
10
RCL
11
STO IND 13 ST-
12
ST+
X
RCL
11
RCL 12
STO 14 GTO
01
-
XEQ IND 00 RCL
16
CHS
-
RCL 11
X<>Y
RCL
11
STO IND 14 ST+
12
STO IND 14 STO
12
STO IND 13 X^2
-These programs use formulas of order 2 and may be replaced by similar
subroutines,
provided the formulas are of the kind . . . +
O(h2)
References:
[1] F.Scheid - "Numerical Analysis" - Mc Graw Hill - ISBN 07-055197-9
[2] Abramowitz and Stegun , "Handbook of Mathematical Functions" -
Dover Publications - ISBN 0-486-61272-4
[3] 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