Triangular Systems for the HP-41
Overview
-This program solves one - or several - linear system(s) whose principal
matrix has only zeros above its diagonal.
-It may be used after "triangularizing" a linear system ( Gaussian
method, Householder method ... )
B = A.X where A is a lower
triangular matrix.
Program Listing
Data Registers: R00 is unused ( Registers R01 thru Rn.m are to be initialized before executing "TRS" )
• R01 = b1
• Rn+1 = a1,1 .....................
• Rnm-n+1 = a1,n with
ai,j = 0 for j > i
• R02 = b2
• Rn+2 = a2,1 .....................
• Rnm-n = a2,n
................ ...............................................................................
• Rnn = bn • R2n = an,1 ..................... • Rnm = an,n
>>> At the end x1 , .......... , xn are in registers R01 to Rnn.
• This program may be used to solve several linear systems
with the same "principal" matrix,
especially if you want to invert the lower
triangular matrix itself.
Flags: /
Subroutines: /
01 LBL "TRS"
02 STO N 03 STO O 04 X<>Y 05 ST* N 06 .1 07 % 08 STO M 09 + 10 STO Q 11 ISG M |
12 ISG N
13 LBL 01 14 CLX 15 STO P 16 LBL 02 17 RCL IND N 18 ST/ IND M 19 RCL M 20 RCL IND X 21 SIGN 22 ISG M |
23 X=0?
24 GTO 04 25 ISG Y 26 ISG N 27 LBL 03 28 CLX 29 RCL IND N 30 LASTX 31 * 32 ST- IND Y 33 ISG N |
34 CLX
35 ISG Y 36 GTO 03 37 RCL P 38 ISG X 39 CLX 40 STO P 41 ST+ N 42 GTO 02 43 LBL 04 44 RCL Q |
45 FRC
46 ST+ M 47 LASTX 48 INT 49 X^2 50 DSE X 51 ST- N 52 DSE O 53 GTO 01 54 CLA 55 END |
( 96 bytes / SIZE 1+n(c+n) )
STACK | INPUTS | OUTPUTS |
Y | n | / |
X | c | / |
where n = number of raws
and c = number of systems ( c + n =
number of columns )
Example1: Solve the triangular system:
4 = 2 x
5 = 3 x + 4 y
6 = 5 x + 7 y + 3 z
-Store
4 2 0
0
R01 R04 R07 R10
5 3 4
0 into
R02 R05 R08 R11
6 5 7
3
R03 R06 R09 R12
3 ENTER^
1 XEQ "TRS" >>>>
( 8 )
---Execution time = 3s---
-And we have
R01 = x = 2
R02 = y = -1/4
R03 = z = -3/4
Example2: If you want to invert the above square matrix A, store the identity matrix in R01 thru R09 and A in R10 thru R18
R01 R04 R07 R10 R13 R16
1 0 0 2 0 0
R02 R05 R08 R11 R14 R17
= 0 1 0 3 4
0
R03 R06 R09 R12 R15 R18
0 0 1 5 7 3
3 ENTER^
3 XEQ "TRS" >>>>
( 8 )
---Execution time = 9s---
-And the inverse is in registers R01 thru R09
R01 R04 R07 1/2
0 0
R02 R05 R08 = -3/8
1/4 0
R03 R06 R09 1/24
-7/12 1/3
Notes:
-The square matrix itself is unchanged
-Since synthetic registers P & Q are used, don't interrupt "TRS",
this could change the contents of these registers.
-The alpha register is cleared at the end.
Variant:
-You can also avoid to store the zero-elements of the matrix ( above
the diagonal ).
-In this case,
add LASTX + ENTER^
SIGN ST+ X / after line
49
replace line 42 by GTO 01
delete lines 37 to 41 and lines 14 to 16
( 53 lines / 90 bytes )
-In example 2, store
R01 R04 R07 R10 R13 R15
1 0 0 2 4 3
R02 R05 R08 R11 R14
= 0 1 0 3 7
R03 R06 R09 R12
0 0 1 5
3 ENTER^
3 XEQ "TRS" >>>>
( 5 )
---Execution time = 8s---
-And the inverse is still in registers R01 thru R09
R01 R04 R07 1/2
0 0
R02 R05 R08 = -3/8
1/4 0
R03 R06 R09 1/24
-7/12 1/3
-Since the SIZE becomes 1 + c n + n(n+1)/2 so you can solve
a triangular system of 23 equations in 23 unknowns.