Overview
1°) Real Unknowns
2°) Complex Unknowns
-If F is a contraction mapping on a complete metric space, then the equation
F ( X ) = X has a unique solution
which is the limit of the sequence: X(k+1) = F(X(k))
where X(0) is arbitrary.
-This theorem is used in the following program to solve a system of n equations
in n unknowns written in the form:
x1 = f1 ( x1
, ... , xn )
x2 = f2 ( x1
, ... , xn )
.............................
xn = fn ( x1 , ... , xn )
-The advantage of this method is its simplicity: there is no need to solve
a n x n linear system like with "NLS" ( cf "linear and non-linear systems
for the HP-41" ).
-It could be used to solve large linear or non-linear systems, with n >
16 , which would be impossible otherwise with an HP-41.
-Unfortunately, it's not so easy to find the good function F that leads to
convergence...
1°) Real Unknowns
Data Registers: • R00 = n = the number of unknowns ( All these registers are to be initialized before executing "FXN" )
• R01 = x1
• Rn+1 = f1 name
• R02 = x2
• Rn+2 = f2 name
( x1 , ... , xn ) is an initial guess that you
have to choose.
................................................
• Rnn = xn • R2n = fn name
Flags: /
Subroutines: The n functions
fi computing fi ( x1 ,
... , xn ) in X-register assuming x1 in
R01 ; ...... ; xn in Rnn
-Actually, this program calculates ( x'1 , ... , x'n ) from ( x1 , ... , xn ) by the formulae:
x'1 = f1 ( x1
, x'2 , ... , x'n-1 , x'n )
x'2 = f2 ( x1
, x2 , ... , x'n-1 , x'n )
.............................
x'n-2 = fn-1 ( x1 ,
x2 , ... , x'n-1 , x'n )
x'n-1 = fn-1 ( x1 ,
x2 , ... , xn-1 , x'n )
x'n = fn
( x1 , x2 , ... , xn-1 , xn
)
-In other words, every new estimation of xi
replaces the previous one as soon as it is computed.
-Thus, the program is shorter, it requires less registers and convergence
is improved!
Note:
-As usual, synthetic registers M and N may be replaced by any unused data
registers,
but if , for instance, you replace register N by R99, replace
line 04 by the two lines: CLX STO 99
-To avoid a possible infinite loop, line 21 might be replaced by
E-8 X<Y? or E-8
RCL 00 * X<Y?
01 LBL "FXN" 02 LBL 01 03 VIEW 01 04 CLA 05 RCL 00 |
06 STO M 07 LBL 02 08 RCL 00 09 RCL M 10 + |
11 RCL IND X 12 XEQ IND X 13 ENTER^ 14 X<> IND M 15 - |
16 ABS 17 ST+ N 18 DSE M 19 GTO 02 20 X<> N |
21 X#0? 22 GTO 01 23 CLA 24 END |
( 43 bytes / SIZE 2n+1 )
STACK | INPUTS | OUTPUTS |
X | / | 0 |
Example1: Solve the system:
x2 / y + y / z - z2
= 0
x.y.z - x - y2
= 0
x.ln y - z = 0
-First, let's rewrite this system into the form:
x = z / ln y
y = ( x.y.z - x )1/2
z = ( x2 / y + y / z )1/2
and let's call these 3 functions: "X" "Y" "Z"
LBL "X"
RCL 03
RCL 02
LN
/
RTN
LBL "Y"
RCL 02
RCL 03
*
RCL 01
ST* Y
-
SQRT
RTN
LBL "Z"
RCL 01
X^2
RCL 02
ST/ Y
RCL 03
/
+
SQRT
RTN
-Then, 3 STO 00 ( there are 3 functions )
and if we choose ( 2 ; 2 ; 2 ) as initial guess,
2 STO 01 STO 02 STO 03
"X" ASTO 04
"Y" ASTO 05
"Z" ASTO 06
XEQ "FXN" displays the successive x-values and finally:
x = 1.894868809 in R01y = 2.457696043 in R02
z = 1.703912160 in R03
Note:
-In fact, we can write a simple program for each problem without any subroutine:
01 LBL "FX" 02 LBL 01 03 VIEW 01 04 RCL 03 05 RCL 02 06 LN 07 / 08 ENTER |
09 X<> 01 10 - 11 ABS 12 STO 00 13 RCL 02 14 RCL 03 15 * 16 RCL 01 |
17 ST* Y 18 - 19 SQRT 20 ENTER 21 X<> 02 22 - 23 ABS 24 ST+ 00 |
25 RCL 01 26 X^2 27 RCL 02 28 ST/ Y 29 RCL 03 30 / 31 + 32 SQRT |
33 ENTER 34 X<> 03 35 - 36 ABS 37 RCL 00 38 + 39 X#0? 40 GTO 01 41 END |
( 56 bytes / SIZE nnn+1 )
STACK | INPUTS | OUTPUTS |
X | / | 0 |
-Let's store the initial guesses into R01 to Rnn ( 2 STO 01 STO 02 STO 03 ) and XEQ "FX"
-The successive x-values are displayed and finally:
x = 1.894868809 in R01
y = 2.457696043 in R02
z = 1.703912160 in R03
Example2:
-This program may also be used to solve n x n linear systems A.X = B ,
especially when A is a "dominant diagonal" matrix.
( If n > 16 , it couldn't be solved by a classic linear-system program
because at most 319 registers are available )
-For instance, if the system:
10.x + y
- z = 1
x = ( 1 - y + z ) / 10
2.x + 11.y + 3.z =
4 is rewritten:
y = ( 4 - 2.x - 3.z ) / 11 the guess
( 0 ; 0 ; 0 ) assures convergence.
3.x -
y - 12. z = 2
z = ( -2 + 3.x - y ) / 12
( The solution is x = 0.040098200
; y = 0.408346972 ; z = -0.190671031
)
Remark:
-Occasionally, it will also work for a system like:
2.x + 3.y - 4.z = -2
x = ( ( 7.x + 3.x.y - 2.x.z ) / 4 )1/2
3.x + 2.y + 5.z = 30
If it's rewritten y = ( ( -2.y - 2.x.y + 4.y.z )
/ 3 )1/2
4.x - 3.y + 2.z = 7
z = ( ( 30.z - 3x.z - 2.y.z ) / 5 )1/2
The initial guess ( 3 ; 3 ; 3 ) leads to the solution!
Exercise: Find a solution of the following system:
x = ( y2 + z2 - z.t + u.v + w2
)1/2 ; y = ( x + y + z + t - u -
v - w ) / ( 2.y ) ; z = ( x.y.(
u + v ) + z.( t - w ) )1/3
t = ( ( x + y + z ).( u + v + w ) )1/2 ; u
= 2.( z + 2.t ) / ( x2 + y2 + u2 + v2
+ w2 ) ; v = ( x.y2.z + t.u.w2
)1/4 ; w = ( x.y.z + 2.t.u.v )1/3
Answer: x = 2.820317813 ; y = 1.992285489 ;
z = 3.435794297 ; t = 8.547543120 ; u = 0.924440439 ;
v = 3.672472185 ; w = 4.260625159
2°) Complex Unknowns
z = x + i.y
Data Registers: • R00 = n = the number of unknowns ( All these registers are to be initialized before executing "FZN" )
• R01 = x1 •
R02 = y1 • R2n+1 = f1
name
• R03 = x2 •
R04 = y2 • R2n+2 = f2
name ( z1
= x1 + i.y1 , ... , zn = xn
+ i.yn ) is an initial guess you have to choose.
....................................................................
• R2n-1 = xn • R2n = yn • R3n = fn name
Flags: /
Subroutines: The n functions fi
computing fi ( z1 , ... , zn
) = X + i.Y in X- and Y-registers assuming z1
in R01 R02 , ...... , zn in R2n-1 R2n
-To avoid a possible infinite loop, line 33 might be replaced by
E-8 X<Y? or E-8
RCL 00 * X<Y?
01 LBL "FZN" 02 LBL 01 03 VIEW 01 04 CLA 05 RCL 00 06 ST+ X 07 STO M 08 LBL 02 |
09 RCL 00 10 ST+ X 11 RCL M 12 2 13 / 14 + 15 RCL IND X 16 XEQ IND X |
17 X<>Y 18 ENTER^ 19 X<> IND M 20 - 21 ABS 22 X<>Y 23 ENTER^ 24 DSE M |
25 X<>IND M 26 - 27 ABS 28 + 29 ST+ N 30 DSE M 31 GTO 02 32 X<> N |
33 X#0? 34 GTO 01 35 CLA 36 END |
( 59 bytes / SIZE 3n+1 )
STACK | INPUTS | OUTPUTS |
X | / | 0 |
Example: Find a solution of the system:
z = ( z2 - z' )1/3 , z' = ( (z')2
- z )1/4
-Load the following routine
LBL "Z"
RCL 02
RCL 01
XEQ "Z^2"
( cf "Complex Functions for the HP-41" )
RCL 03
-
X<>Y
RCL 04
-
X<>Y
3
1/X
XEQ "Z^X"
( cf "Complex Functions for the HP-41" )
RTN
LBL "T"
RCL 04
RCL 03
XEQ "Z^2"
( cf "Complex Functions for the HP-41" )
RCL 01
-
X<>Y
RCL 02
-
X<>Y
4
1/X
XEQ "Z^X"
( cf "Complex Functions for the HP-41" )
RTN
Z ASTO 05 T ASTO 06
2 STO 00 and if we choose z = z' = 1 + i as
initial guesses 1 STO 01 STO 02 STO 03
STO 04
XEQ "FZN" the successive x1 are displayed and finally:
z = R01 + i R02 = 1.038322757 + 0.715596476
i
z' = R03 + i R04 = 1.041713085 - 0.462002405 i
( execution time = 5mn43s )