Overview
1°) Complex Operations
2°) Complex Equations
a) Secant Method
b) Quadratic Interpolation
c) Newton's Method
d) A Better Method
1°) Complex Operations
-The global labels "Z+Z" "Z-Z" "Z*Z" "Z/Z"
mean addition, subtraction, multiplication and division.
"Z^2" "SQRTZ" "LNZ" "E^Z" "1/Z"
mean square, square root, logarithm, exponential, reciprocal.
"SINZ" "COSZ" "TANZ" "ASINZ" "ACOSZ"
"ATANZ" correspond to sine, cosine, tangent and their inverses.
"SHZ" "CHZ" "THZ" "ASHZ" "ACHZ"
"ATHZ" correspond to hyperbolic sine, hyperbolic cosine, hyperbolic
tangent and their inverses:
-I've used the French notations ( sh z instead of sinh z ...
etc ... ) which have the advantage of saving several bytes and keystrokes.
"Z^X" and "Z^Z" stand for raising a complex number to
a real power and a complex power respectively.
-These programs use no data register and no external subroutine.
-However, ArcCosh z clear synthetic registers M &N - which can
be replaced by R00 & R01.
-And, for instance, "TANZ" calls "THZ" as a subroutine
since tan z = i.tanh (-i.z) and similarly for many other complex
functions.
-In these cases, local labels have been inserted after the global labels
( for example, XEQ 03 LBL 03 instead of XEQ "THZ",
which saves 1 byte and executes faster ) and so on ...
-Lines 144 & 156 are only useful te restore the DEG mode: they
may be deleted if RAD is your favorite angular mode.
-To get the magnitude of a complex number, simply press R-P.
Formulae:
Sinh z = ( ez - e-z )/2
ArcSinh z = Ln [ z + ( z2 + 1 )1/2 ]
Cosh z = ( ez + e-z )/2
ArcCosh z = Ln [ z + ( z + 1 )1/2 ( z - 1 )1/2 ]
Tanh z = ( e2z - 1 )/( e2z
+ 1 )
ArcTanh z = [ Ln ( 1 + z ) - Ln ( 1 - z ) ]/2
Sin z = -i Sinh iz
ArcSin z = -i ArcSinh iz
Cos z = Cosh iz
ArcCos z = PI/2 - ArcSin z
Tan z = i Tanh -iz
ArcTan z = i ArcTanh -iz
Data Registers: /
Flags: /
Subroutines: /
01 LBL "SINZ"
02 X<>Y 03 CHS 04 XEQ 01 05 CHS 06 X<>Y 07 RTN 08 LBL "TANZ" 09 CHS 10 X<>Y 11 XEQ 03 12 X<>Y 13 CHS 14 RTN 15 LBL "ASINZ" 16 LBL 04 17 X<>Y 18 CHS 19 XEQ 05 20 CHS 21 X<>Y 22 RTN 23 LBL "ATANZ" 24 CHS 25 X<>Y 26 XEQ 06 27 X<>Y 28 CHS 29 RTN 30 LBL "SHZ" 31 LBL 01 32 XEQ 00 33 XEQ 01 34 GTO 10 35 LBL "COSZ" 36 X<>Y 37 CHS |
38 LBL "CHZ"
39 XEQ 00 40 XEQ 02 41 GTO 10 42 LBL "ATHZ" 43 LBL 06 44 RCL X 45 1 46 ST- Z 47 + 48 R^ 49 X<>Y 50 XEQ 12 51 R^ 52 CHS 53 R^ 54 CHS 55 XEQ 12 56 XEQ 01 57 LBL 10 58 2 59 ST/ Z 60 / 61 RTN 62 LBL "THZ" 63 LBL 03 64 2 65 ST* Z 66 * 67 XEQ 08 68 RCL X 69 1 70 ST- Z 71 + 72 R^ 73 X<>Y 74 LBL "Z/Z" |
75 R-P
76 R^ 77 R^ 78 R-P 79 R^ 80 ST- Z 81 X<> T 82 / 83 P-R 84 RTN 85 LBL 00 86 RCL Y 87 RCL Y 88 XEQ 08 89 R^ 90 CHS 91 R^ 92 CHS 93 GTO 08 94 LBL "ACOSZ" 95 XEQ 04 96 X<>Y 97 CHS 98 PI 99 2 100 / 101 R^ 102 - 103 RTN 104 LBL "ACHZ" 105 STO M 106 X<>Y 107 STO N 108 X<>Y 109 1 110 + 111 XEQ 07 |
112 RCL M
113 1 114 - 115 RCL N 116 X<>Y 117 XEQ 07 118 XEQ 03 119 X<>Y 120 0 121 X<> N 122 + 123 X<>Y 124 0 125 X<> M 126 + 127 GTO 12 128 LBL "ASHZ" 129 LBL 05 130 RCL Y 131 RCL Y 132 XEQ 05 133 SIGN 134 ST* X 135 ST+ L 136 X<> L 137 XEQ 07 138 XEQ 02 139 LBL "LNZ" 140 LBL 12 141 RAD 142 R-P 143 LN 144 DEG 145 RTN 146 LBL "Z^Z" 147 R^ 148 R^ |
149 XEQ 12
150 XEQ 03 151 LBL "E^Z" 152 LBL 08 153 RAD 154 E^X 155 P-R 156 DEG 157 RTN 158 LBL "Z^X" 159 RDN 160 R-P 161 R^ 162 ST* Z 163 Y^X 164 P-R 165 RTN 166 LBL "Z-Z" 167 LBL 01 168 CHS 169 X<>Y 170 CHS 171 X<>Y 172 LBL "Z+Z" 173 LBL 02 174 X<>Y 175 ST+ T 176 RDN 177 + 178 RTN 179 LBL "Z*Z" 180 LBL 03 181 R-P 182 R^ 183 R^ 184 R-P 185 X<>Y |
186 ST+ T
187 RDN 188 * 189 P-R 190 RTN 191 LBL "1/Z" 192 R-P 193 1/X 194 X<>Y 195 CHS 196 X<>Y 197 P-R 198 RTN 199 LBL "Z^2" 200 LBL 05 201 R-P 202 X^2 203 X<>Y 204 ST+ X 205 X<>Y 206 P-R 207 RTN 208 LBL "SQRTZ" 209 LBL 07 210 R-P 211 SQRT 212 SIGN 213 ST+ X 214 ST/ Y 215 X<> L 216 P-R 217 END |
( 448 bytes / SIZE 000 )
1°) First case: Function of one complex number
STACK | INPUTS | OUTPUTS |
Y | y | v |
X | x | u |
where z = x+i.y ; f(z) = u+i.v
Example: z = 2+3.i
-Calculate z2 ; z1/2 ; 1/z ; exp(z) ; Ln(z) ; sin z ; cos z ; tan z ; Asin z ; Acos z ; Atan z ; Sinh z ; Cosh z ; Tanh z ; Asinh z ; Acosh z ; Atanh z
3 ENTER^ 2 XEQ "Z^2"
>>> -5 X<>Y
12 whence (2+3.i)2
= -5+12.i
3 ENTER^ 2 XEQ "SQRTZ" >>>
1.6741 X<>Y 0.8960 whence
(2+3.i)1/2 = 1.6741+0.8960.i
3 ENTER^ 2 XEQ "1/Z"
>>> 0.1538 X<>Y -0.2308
whence 1/(2+3.i) = 0.1538-0.2308.i
3 ENTER^ 2 XEQ "E^Z"
>>> -7.3151 X<>Y 1.0427
whence exp(2+3.i) = -7.3151+1.0427.i
3 ENTER^ 2 XEQ "LNZ"
>>> 1.2825 X<>Y 0.9828
whence Ln(2+3.i) = 1.2825+0.9828.i
3 ENTER^ 2 XEQ "SINZ"
>>> 9.1545 X<>Y -4.1689
whence Sin(2+3.i) = 9.1545-4.1689.i
3 ENTER^ 2 XEQ "COSZ"
>>> -4.1896 X<>Y -9.1092
whence Cos(2+3.i) = -4.1896-9.1092.i
3 ENTER^ 2 XEQ "TANZ"
>>> -0.0038 X<>Y 1.0032
whence Tan(2+3.i) = -0.0038+1.0032.i
3 ENTER^ 2 XEQ "ASINZ" >>>
0.5707 X<>Y 1.9834 whence
Asin(2+3.i) = 0.5707+1.9834.i
3 ENTER^ 2 XEQ "ACOSZ" >>>
1.0001 X<>Y -1.9834 whence
Acos(2+3.i) = 1.0001-1.9834.i
3 ENTER^ 2 XEQ "ATANZ" >>>
1.4099 X<>Y 0.2291 whence
Atan(2+3.i) = 1.4099+0.2291.i
3 ENTER^ 2 XEQ "SHZ"
>>> -3.5906 X<>Y 0.5309 whence
Sinh(2+3.i) = -3.5906+0.5309.i
3 ENTER^ 2 XEQ "CHZ"
>>> -3.7245 X<>Y 0.5118
whence Cosh(2+3.i) = -3.7245+0.5118.i
3 ENTER^ 2 XEQ "THZ"
>>> 0.9654 X<>Y -0.0099
whence Tanh(2+3.i) = 0.9654-0.0099.i
3 ENTER^ 2 XEQ "ASHZ"
>>> 1.9686 X<>Y 0.9647
whence Asinh(2+3.i) = 1.9686+0.9647.i
3 ENTER^ 2 XEQ "ACHZ" >>>
1.9834 X<>Y 1.0001 whence
Acosh(2+3.i) = 1.9834+1.0001.i
3 ENTER^ 2 XEQ "ATHZ"
>>> 0.1469 X<>Y 1.3390
whence Atanh(2+3.i) = 0.1469+1.3390.i
Note: "Z^2" "SQRTZ" "1/Z"
"E^Z" and "LNZ" save registers Z and T ( this feature
is important when they are called as subroutines by the other functions
).
2°) Second case: raising a complex number to
a real power
STACK | INPUTS | OUTPUTS |
Z | y | / |
Y | x | v |
X | r | u |
where z = x+i.y ; zr = u+i.v
Example: Evaluate (2+3.i)1/5
3 ENTER^ 2 ENTER^ 5 1/X XEQ "Z^X" >>> 1.2675 X<>Y 0.2524 whence (2+3.i)1/5 = 1.2675+0.2524.i
Note: "Z^X" saves T-register in
registers Z and T.
3°) Third case: Function of two complex numbers.
STACK | INPUTS | OUTPUTS |
T | y | / |
Z | x | / |
Y | y' | v |
X | x' | u |
where z = x+i.y ; z' = x'+i.y' ; f(z;z') = u+i.v
Example: z = 2+3.i ; z' = 4+7.i
Compute z+z' ; z-z' ; z.z' ; z/z' ; zz'
3 ENTER^ 2 ENTER^ 7 ENTER^
4 XEQ "Z+Z" gives
6 X<>Y
10 whence z+z' = 6+10.i
3 ENTER^ 2 ENTER^ 7 ENTER^
4 XEQ "Z-Z" gives
-2 X<>Y
-4 whence z-z' = -2-4.i
3 ENTER^ 2 ENTER^ 7 ENTER^
4 XEQ "Z*Z" gives -13
X<>Y 26
whence z.z' = -13+26.i
3 ENTER^ 2 ENTER^ 7 ENTER^
4 XEQ "Z/Z" gives 0.4462
X<>Y -0.0308 whence z/z' = 0.4462-0.0308.i
3 ENTER^ 2 ENTER^ 7 ENTER^
4 XEQ "Z^Z" gives 0.1638
X<>Y 0.0583 whence
zz' = 0.1638+0.0583.i
Notes:
-This program may of course be simplified if you can use the M-code functions:
1/Z Z*Z Z/Z Z^2 SQRTZ which are listed in "A few M-code Routines for the HP-41"
-Slightly different formulae may also be used to compute ArcCosh ArcTanh and ArcCos:
Sinh z = ( ez - e-z )/2
ArcSinh z = Ln [ z + ( z2 + 1 )1/2 ]
Cosh z = ( ez + e-z )/2
ArcCosh z = Ln [ z + ( z2 - 1 )1/2 ]
Tanh z = ( e2z - 1 )/( e2z
+ 1 )
ArcTanh z = [ Ln (( 1 + z ) / ( 1 - z )) ]/2
Sin z = -i Sinh iz
ArcSin z = -i ArcSinh iz
Cos z = Cosh iz
ArcCos z = -i ArcCosh z
Tan z = i Tanh -iz
ArcTan z = i ArcTanh -iz
-These definitions are possible and easier to program since no synthetic
register is necessary.
-But they don't always give the principal value of some inverse
hyperbolic functions.
-Anyway, here is this simpler program:
Data Registers: /
Flags: /
Subroutines: /
01 LBL "SINZ"
02 X<>Y 03 CHS 04 XEQ 01 05 CHS 06 X<>Y 07 RTN 08 LBL "TANZ" 09 CHS 10 X<>Y 11 XEQ 03 12 X<>Y 13 CHS 14 RTN 15 LBL "ASINZ" 16 X<>Y 17 CHS 18 XEQ 05 19 CHS 20 X<>Y 21 RTN 22 LBL "ATANZ" 23 CHS 24 X<>Y 25 XEQ 06 26 X<>Y 27 CHS 28 RTN 29 LBL "SHZ" 30 LBL 01 31 XEQ 00 32 XEQ 01 33 GTO 10 34 LBL "COSZ" 35 X<>Y 36 CHS 37 LBL "CHZ" 38 XEQ 00 39 XEQ 02 |
40 GTO 10
41 LBL "ATHZ" 42 LBL 06 43 RCL X 44 1 45 ST+ Z 46 X<>Y 47 - 48 R^ 49 CHS 50 X<>Y 51 XEQ 07 52 XEQ 12 53 LBL 10 54 2 55 ST/ Z 56 / 57 RTN 58 LBL "THZ" 59 LBL 03 60 2 61 ST* Z 62 * 63 XEQ 08 64 RCL X 65 1 66 ST- Z 67 + 68 R^ 69 X<>Y 70 LBL "Z/Z" 71 LBL 07 72 R-P 73 R^ 74 R^ 75 R-P 76 R^ 77 ST- Z 78 X<> T |
79 /
80 P-R 81 RTN 82 LBL 00 83 RCL Y 84 RCL Y 85 XEQ 08 86 R^ 87 CHS 88 R^ 89 CHS 90 GTO 08 91 LBL "ACOSZ" 92 XEQ 04 93 CHS 94 X<>Y 95 RTN 96 LBL "ACHZ" 97 LBL 04 98 XEQ 13 99 CHS 100 GTO 09 101 LBL "ASHZ" 102 LBL 05 103 XEQ 13 104 LBL 09 105 ST+ L 106 X<> L 107 XEQ 11 108 XEQ 02 109 LBL "LNZ" 110 LBL 12 111 RAD 112 R-P 113 LN 114 DEG 115 RTN 116 LBL 13 117 RCL Y |
118 RCL Y
119 XEQ 05 120 SIGN 121 ST* X 122 RTN 123 LBL "Z^Z" 124 R^ 125 R^ 126 XEQ 12 127 XEQ 03 128 LBL "E^Z" 129 LBL 08 130 RAD 131 E^X 132 P-R 133 DEG 134 RTN 135 LBL "Z^X" 136 RDN 137 R-P 138 R^ 139 ST* Z 140 Y^X 141 P-R 142 RTN 143 LBL "Z-Z" 144 LBL 01 145 CHS 146 X<>Y 147 CHS 148 X<>Y 149 LBL "Z+Z" 150 LBL 02 151 X<>Y 152 ST+ T 153 RDN 154 + 155 RTN 156 LBL "Z*Z" |
157 LBL 03
158 R-P 159 R^ 160 R^ 161 R-P 162 X<>Y 163 ST+ T 164 RDN 165 * 166 P-R 167 RTN 168 LBL "1/Z" 169 R-P 170 1/X 171 X<>Y 172 CHS 173 X<>Y 174 P-R 175 RTN 176 LBL "Z^2" 177 LBL 05 178 R-P 179 X^2 180 X<>Y 181 ST+ X 182 X<>Y 183 P-R 184 RTN 185 LBL "SQRTZ" 186 LBL 11 187 R-P 188 SQRT 189 SIGN 190 ST+ X 191 ST/ Y 192 X<> L 193 P-R 194 END |
( 415 bytes / SIZE 000 )
-Same instructions and - in most cases - same results...
2°) Complex Equations: f(z) = 0
a) The "Secant"
Method
-This program uses an iterative algorithm.
-Starting with 2 distinct initial guesses z0 = x0+i.y0
; z1 = x1+i.y1 , it calculates
zk+1 = zk - f(zk).(zk - zk-1)
/ [ f(zk) - f(zk-1) ] ( k
= 1 ; 2 ; 3 ; ....... )
-The process is repeated until 2 consecutive approximations are equal.
Data Registers: • R00 = Function name ( Global label, maximum of 6 characters. This register is to be initialized before executing "ROOTZ" )
R01 = x R03 = a R05 = x'
R02 = y R04 = b R06 = y' where
f(z) = f(x+i.y) = a+i.b
Flag: /
Subroutine: A program which computes
f(z) = a+i.b assuming x is in X-register and y is in Y-register
upon entry
In other words, the stack Y = y
Y = b
must be changed from
X = x to X = a
where z = x+i.y and f(z) = f(x+i.y) = a+i.b
01 LBL "ROOTZ"
02 STO 01 03 X<>Y 04 STO 02 05 R^ 06 STO 06 07 R^ 08 STO 05 09 XEQ IND 00 10 STO 03 11 X<>Y 12 STO 04 |
13 LBL 01
14 VIEW 01 15 RCL 02 16 RCL 01 17 XEQ IND 00 18 RCL 04 19 RCL 03 20 R^ 21 STO 04 22 ST- Z 23 R^ 24 STO 03 |
25 ST- Z
26 R-P 27 R^ 28 R^ 29 R-P 30 X<>Y 31 ST- T 32 RDN 33 X#0? 34 / 35 RCL 02 36 ENTER^ |
37 X<> 06
38 - 39 RCL 01 40 STO L 41 X<> 05 42 ST- L 43 X<> L 44 R-P 45 X<>Y 46 ST+ T 47 RDN 48 * |
49 P-R
50 ST+ 01 51 X<>Y 52 ST+ 02 53 E-8 54 LASTX 55 X>Y? 56 GTO 01 57 RCL 02 58 RCL 01 59 END |
( 86 bytes / SIZE 007 )
STACK | INPUTS | OUTPUTS |
T | y0 | / |
Z | x0 | / |
Y | y1 | y |
X | x1 | x |
Example: Find a root of
sinh z + z2 + Pi = 0. First, we
load a routine to compute f(z) , for instance:
LBL "T"
STO 07
X<>Y
STO 08
X<>Y
XEQ "SHZ"
RCL 08
RCL 07
XEQ "Z^2"
XEQ "Z+Z"
PI
+
RTN
And if we choose z0 = 0 ; z1 = 1+i
T ASTO 00
0 ENTER^ ENTER^
1 ENTER^ XEQ "ROOTZ" the succesive
x-values are displayed
and we get -0.278189856
( execution time = 77 seconds )
X<>Y 1.812880366
Whence -0.278189856 + 1.812880366.i is a solution. ( There are many other solutions like 4.419361546 + 4.697881722.i ... etc ... )
Note:
-The iterations stop when zk+1 = zk
or when f(zk+1) = f(zk) Therefore,
check f(z) in registers R03 & R04
b) Quadratic
Interpolation
-Starting with 3 initial guesses: z0 = x0+i.y0 ; z1 = x1+i.y1 ; z2 = x2+i.y2 , this program calculates
A = ( z1-z0 ).f(z2) +
( z0-z2 ).f(z1) + ( z2-z1
).f(z0)
B = ( z1-z0 ).( 2.z2-z1-z0
).f(z2) - ( z0-z2 )2.f(z1)
+ ( z2-z1 )2.f(z0)
C = ( z2-z1 ).( z1-z0
).( z2-z0 ).f(z2)
and z3 = z2 - 1 / [ B/(2.C) + E.( B2/(4C2) - A/C )1/2 ] where E = +1 or -1 ( the sign is choosen to produce the larger denominator )
-The process is repeated until | zk+1-zk | is smaller than 10-8 or C = 0 ( check f(z) in R03 & R04 )
Data Registers: • R00 = Function name ( Global label, maximum of 6 characters. This register is to be initialized before executing "RTZ2" )
R01 = x R03 = a R05 thru R20: temp
R02 = y R04 = b where f(z) = f(x+i.y) = a+i.b
Flag: /
Subroutines: "Z+Z" "Z*Z" "Z^2"
"SQRTZ"
and a program which computes f(z) = a+i.b assuming x is in X-register and y is in Y-register upon entry
The stack must
Y = y Y = b
where z = x+i.y
be changed from
X = x to X = a
and f(z) = f(x+i.y) = a+i.b
( Registers R03 R04 R13 R14 ... etc ... may be used by this subroutine )
-Line 58 is a three-byte GTO 02
-Line 170 is a three-byte GTO 01
01 LBL "RTZ2"
02 STO 01 03 RDN 04 STO 02 05 X<>Y 06 STO 05 07 STO 06 08 STO 09 09 STO 10 10 ST- T 11 - 12 R^ 13 XEQ IND 00 14 STO 07 15 X<>Y 16 STO 08 17 RCL 02 18 RCL 01 19 RCL 05 20 ST+ X 21 ST- Z 22 - 23 XEQ IND 00 24 STO 11 25 X<>Y 26 STO 12 27 LBL 01 28 VIEW 01 29 RCL 02 30 RCL 01 31 XEQ IND 00 32 STO 03 33 X<>Y 34 STO 04 35 X<>Y |
36 RCL 10
37 RCL 09 38 XEQ "Z*Z" 39 STO 13 40 X<>Y 41 STO 14 42 RCL 06 43 RCL 10 44 + 45 STO 20 46 RCL 05 47 RCL 09 48 + 49 STO 19 50 RCL 14 51 RCL 13 52 XEQ "Z*Z" 53 RCL 06 54 RCL 05 55 XEQ "Z*Z" 56 R-P 57 X=0? 58 GTO 02 59 CHS 60 STO 15 61 X<>Y 62 STO 16 63 RCL 06 64 RCL 20 65 + 66 RCL 05 67 RCL 19 68 + 69 RCL 14 70 RCL 13 |
71 XEQ "Z*Z"
72 STO 17 73 X<>Y 74 STO 18 75 RCL 20 76 RCL 19 77 RCL 08 78 RCL 07 79 XEQ "Z*Z" 80 ST- 13 81 X<>Y 82 ST- 14 83 X<>Y 84 RCL 20 85 RCL 19 86 XEQ "Z*Z" 87 ST- 17 88 X<>Y 89 ST- 18 90 RCL 06 91 RCL 05 92 RCL 12 93 RCL 11 94 XEQ "Z*Z" 95 ST+ 13 96 X<>Y 97 ST+ 14 98 X<>Y 99 RCL 06 100 RCL 05 101 XEQ "Z*Z" 102 ST+ 17 103 X<>Y 104 ST+ 18 105 RCL 14 |
106 RCL 13
107 R-P 108 STO 13 109 X<>Y 110 STO 14 111 RCL 18 112 RCL 17 113 R-P 114 RCL 16 115 ST- 14 116 ST- Z 117 X<> 15 118 ST/ 13 119 ST+ X 120 / 121 P-R 122 STO 15 123 X<>Y 124 STO 16 125 X<>Y 126 XEQ "Z^2" 127 RCL 14 128 RCL 13 129 P-R 130 XEQ "Z+Z" 131 XEQ "SQRTZ" 132 RCL 16 133 RCL Z 134 ST- 16 135 + 136 RCL 15 137 RCL Z 138 ST- 15 139 + 140 R-P |
141 X<>Y
142 RCL 16 143 RCL 15 144 R-P 145 R^ 146 X<Y? 147 RCL Y 148 X#0? 149 1/X 150 R^ 151 CHS 152 X<>Y 153 P-R 154 ST+ 01 155 X<> 05 156 STO 09 157 X<>Y 158 ST+ 02 159 X<> 06 160 STO 10 161 RCL 03 162 X<> 07 163 STO 11 164 RCL 04 165 X<> 08 166 STO 12 167 E-8 168 LASTX 169 X>Y? 170 GTO 01 171 LBL 02 172 RCL 02 173 RCL 01 174 END |
( 281 bytes / SIZE 021 )
STACK | INPUTS | OUTPUTS |
Z | h | / |
Y | y0 | y |
X | x0 | x |
( The 3 initial guesses are actually z0 = x0+i.y0 ; z0-(1+i).h ; z0-2.(1+i).h )
Example: With the same equation
sinh z + z2 + Pi = 0. We load a routine
to compute f(z)
LBL "T"
STO 03
X<>Y
STO 04
X<>Y
XEQ "SHZ"
RCL 04
RCL 03
XEQ "Z^2"
XEQ "Z+Z"
PI
+
RTN
And if we choose z0 = 1+i and h = 1
T ASTO 00
1 ENTER^ ENTER^
XEQ "RTZ2" the succesive
x-values are displayed and we get -0.278189857
( execution time = 156 seconds )
X<>Y 1.812880366
Whence z = -0.278189857 + 1.812880366.i
Note: In this example, "ROOTZ"
is faster than "RTZ2" but if f is a very complicated
function, the advantage is clearly with "RTZ2"
c) Newton's
Method
-Only one initial guess z0 = x0+i.y0 is needed but we have to compute the first derivative f '(z)
Formula: zk+1 = zk - f(zk)/f '(zk)
Data Registers: • R00 = f name • R03 = f ' name ( these 2 registers are to be initialized before executing "NWTZ" )
R01 = x
R02 = y R04 = | f '(z) | R05: temp
Flag: /
Subroutines:
-A program which computes f(z) assuming x is
in X-register and y is in Y-register upon entry
-a program which computes f '(z) assuming x is in
X-register and y is in Y-register upon entry
01 LBL "NWTZ"
02 STO 01 03 X<>Y 04 STO 02 05 LBL 01 06 VIEW 01 07 RCL 02 08 RCL 01 |
09 XEQ IND 03
10 R-P 11 STO 04 12 X<>Y 13 STO 05 14 RCL 02 15 RCL 01 16 XEQ IND 00 |
17 R-P
18 ENTER^ 19 X<> 04 20 X#0? 21 / 22 X<>Y 23 RCL 05 24 - |
25 X<>Y
26 P-R 27 ST- 01 28 X<>Y 29 ST- 02 30 E-8 31 LASTX 32 X>Y? |
33 GTO 01
34 RCL 04 35 RCL 02 36 RCL 01 37 END |
( 55 bytes / SIZE 006 )
STACK | INPUTS | OUTPUTS |
Z | / | | f(z) | |
Y | y0 | y |
X | x0 | x |
-The output in Z-register should be a "small" number if z = x+i.y is a "true" root
Example: sinh z +
z2 + Pi = 0. We have to load 2 routines
to compute f(z) and f ' (z) = cosh z + 2.z for instance:
LBL "T"
STO 07
X<>Y
STO 08
X<>Y
XEQ "SHZ"
RCL 08
RCL 07
XEQ "Z^2"
XEQ "Z+Z"
PI
+
RTN
LBL "U"
STO 07
X<>Y
STO 08
X<>Y
XEQ "CHZ"
RCL 08
ST+ X
RCL 07
ST+ X
XEQ "Z+Z"
RTN
Then T ASTO 00 U ASTO 03
and with z0 = 1+i
1
ENTER^ XEQ "NWTZ" the successive x-approximations
are displayed
and we get -0.278189857
RDN 1.812880366 whence
z = -0.278189857 + 1.812880366.i
( execution time = 54 seconds )
Note: | f(z) | in Z-register actually
concerns the next to last approximation.
d) A Better
method
-Starting with one initial guess z0 = x0+i.y0
, we now use the first and second derivatives f '(z)
and f "(z) , the recursion formula is:
zk+1 = zk - 1 / [ f '(zk)/f(zk)
+ E.( ( f(zk)/(2.f '(zk)) )2 - f "(zk)
/(2.f (zk)) )1/2 ] where
E = +1 or -1 ( the sign is choosen to produce the larger denominator
)
Data Registers: • R00 = f name • R03 = f ' name • R04 = f " name ( these 3 registers are to be initialized before executing "RTZ4" )
R01 = x
R02 = y R05 = | f '(z) | R06 thru R09: temp
Flag: /
Subroutines:
-A program which computes f(z) assuming
x is in X-register and y is in Y-register upon entry
-A program which computes f '(z) assuming x
is in X-register and y is in Y-register upon entry
-A program which computes f "(z) assuming x
is in X-register and y is in Y-register upon entry
01 LBL "RTZ4"
02 STO 01 03 X<>Y 04 STO 02 05 LBL 01 06 VIEW 01 07 RCL 02 08 RCL 01 09 XEQ IND 03 10 R-P 11 STO 06 12 X<>Y 13 STO 07 14 RCL 02 15 RCL 01 16 XEQ IND 04 17 R-P 18 STO 08 19 X<>Y |
20 STO 09
21 RCL 02 22 RCL 01 23 XEQ IND 00 24 R-P 25 STO 05 26 X=0? 27 GTO 02 28 ST+ X 29 ST/ 06 30 ST/ 08 31 X<>Y 32 ST- 07 33 ST- 09 34 RCL 07 35 ST+ X 36 RCL 06 37 X^2 38 P-R |
39 RCL 09
40 RCL 08 41 P-R 42 ST- Z 43 RDN 44 ST- Z 45 RDN 46 R-P 47 SQRT 48 X<>Y 49 2 50 / 51 X<>Y 52 P-R 53 RCL 07 54 RCL 06 55 P-R 56 STO 06 57 RDN |
58 STO 07
59 RCL Z 60 ST- 07 61 + 62 RCL 06 63 RCL Z 64 ST- 06 65 + 66 R-P 67 X<>Y 68 RCL 07 69 RCL 06 70 R-P 71 R^ 72 X<Y? 73 RCL Y 74 X#0? 75 1/X 76 R^ |
77 CHS
78 X<>Y 79 P-R 80 ST- 01 81 X<>Y 82 ST- 02 83 E-8 84 LASTX 85 X>Y? 86 GTO 01 87 LBL 02 88 RCL 05 89 RCL 02 90 RCL 01 91 END |
( 123 bytes / SIZE 010 )
STACK | INPUTS | OUTPUTS |
Z | / | | f(z) | |
Y | y0 | y |
X | x0 | x |
-The output in Z-register should be a "small" number if z = x+i.y is a "true" root
Example: sinh z +
z2 + Pi = 0. We have to load 3 routines
to compute f(z) ; f ' (z) = cosh z + 2.z and f "(z) = sinh z + 2
, for instance:
LBL "T"
STO 10
X<>Y
STO 11
X<>Y
XEQ "SHZ"
RCL 11
RCL 10
XEQ "Z^2"
XEQ "Z+Z"
PI
+
RTN
LBL "U"
STO 10
X<>Y
STO 11
X<>Y
XEQ "CHZ"
RCL 11
ST+ X
RCL 10
ST+ X
XEQ "Z+Z"
RTN
LBL "V"
XEQ "SHZ"
2
+
RTN
Then T ASTO 00 U ASTO 03
V ASTO 04 and with z0 = 1+i
1
ENTER^ XEQ "RTZ4" the successive
x-approximations are displayed
and we get -0.278189857
RDN 1.812880366 whence
z = -0.278189857 + 1.812880366.i
( execution time = 70 seconds )
Notes:
| f(z) | in Z-register actually concerns the next
to last approximation.
Among these 4 root-finding programs, "RTZ4" has the best
rate of convergence.