Quaternionic Linear Systems for the HP-41
Overview
-This program solves unilateral systems of the form B =
A Q or B = Q A
-Gaussian elimination with partial pivoting is used.
-The product of the pivots is also computed:
-There is a unique solution if and only if this product is different
from zero.
-Several unilateral systems with the same matrix A may also be
solved at the same time.
-Underdetermined & overdetermined systems too.
-Actually, the program is structured like "LS3" ( cf 'Linear and Non-Linear
Systems for the HP-41" )
Program Listing
-For 1 system of n equations in n unknowns, re-write it as:
b1 = a1,1 q1 + ................ + a1,n qn
................................................... where bi , qi , ai,j are quaternions, qi are the unknowns
bn
= an,1 q1 + ................ + an,n qn
-More generally, the coefficients form a nxm matrix P = [ pi,j
] 1 <= i <= n , 1 <= j <= m , which are to be stored
in column order from register R21.
Data Registers: R00 = | ProdPiv |2 ( Registers R21 thru R20+4nm are to be initialized before executing "QLS" )
R01 to R09 & R16 to R19: temp R20 is unused
>>>> R12 to R15 = Product of the Pivots.
• R21 to R24 = p1,1
................................... • R21+4n(m-1)
to R24+4n(m-1) = p1,m
.....................................................................................................................................
• R17+4n to R20+4n = pn,1 .................................... • R17+4n.m to R20+4n.m = pn,m
Flags: F00-F01-F02
CF 00 A pivot is regarded as 0 if it's smaller than
E-7 ( line 123 )
SF 00 Only 0 is regarded as 0
CF 01 Partial pivoting
SF 01 No Pivoting ( not recommended in general -
a few exceptions however )
CF 02 B = A Q is solved
the solutions are usually different
SF 02 B = Q A is solved
because the product is not commutative.
Subroutines: "Q*Q" & "1/Q" ( cf "Quaternions for the HP-41" )
-Lines 145 and 268 are three-byte GTOs
01 LBL "QLS"
02 X<>Y 03 .1 04 % 05 + 06 STO 10 07 ST* Y 08 FRC 09 - 10 STO 11 11 1 12 STO 12 13 LASTX 14 % 15 RCL Z 16 INT 17 + 18 4 19 ST* 10 20 ST* 11 21 * 22 20.02 23 ST+ 11 24 + 25 3 26 - 27 .001004 28 RCL X 29 .004 30 + 31 FS? 02 32 X<>Y 33 STO 19 34 X<>Y 35 STO 18 36 CLX 37 STO 13 38 STO 14 39 STO 15 40 R^ 41 LBL 01 42 STO 09 43 FS? 01 44 GTO 00 45 INT 46 RCL 11 47 FRC |
48 +
49 STO 00 50 3 51 ST+ 00 52 CLX 53 LBL 02 54 RCL IND 00 55 X^2 56 DSE 00 57 RCL IND 00 58 X^2 59 + 60 DSE 00 61 RCL IND 00 62 X^2 63 + 64 DSE 00 65 RCL IND 00 66 X^2 67 + 68 X<=Y? 69 GTO 02 70 RCL 00 71 X<>Y 72 ENTER^ 73 LBL 02 74 RDN 75 DSE 00 76 GTO 02 77 RCL 09 78 ENTER^ 79 STO 00 80 FRC 81 R^ 82 INT 83 + 84 X=Y? 85 GTO 00 86 STO 01 87 LBL 03 88 4 89 RCL 00 90 RCL 01 91 LBL 04 92 RCL IND X 93 X<> IND Z 94 STO IND Y |
95 CLX
96 SIGN 97 ST+ Z 98 + 99 DSE Z 100 GTO 04 101 DSE 00 102 CLX 103 DSE 01 104 GTO 03 105 LASTX 106 CHS 107 ST* 12 108 ST* 13 109 ST* 14 110 ST* 15 111 LBL 00 112 RCL 18 113 RCL 09 114 INT 115 + 116 REGMOVE 117 RCL 19 118 LASTX 119 + 120 REGMOVE 121 CLX 122 FC? 00 123 E-7 124 RCL 01 125 ABS 126 RCL 02 127 ABS 128 + 129 RCL 03 130 ABS 131 + 132 RCL 04 133 ABS 134 + 135 X<=Y? 136 CLX 137 X#0? 138 GTO 00 139 STO 12 140 STO 13 141 STO 14 |
142 STO 15
143 LBL 00 144 X=0? 145 GTO 00 146 12 147 RCL 18 148 + 149 REGMOVE 150 XEQ "Q*Q" 151 STO 12 152 RDN 153 STO 13 154 RDN 155 STO 14 156 X<>Y 157 STO 15 158 RCL 18 159 5 160 + 161 REGMOVE 162 RCL 04 163 RCL 03 164 RCL 02 165 RCL 01 166 XEQ "1/Q" 167 STO 01 168 RDN 169 STO 02 170 RDN 171 STO 03 172 X<>Y 173 STO 04 174 RCL 18 175 1 176 + 177 REGMOVE 178 RCL 09 179 STO 00 180 LBL 05 181 RCL 00 182 INT 183 RCL 19 184 + 185 REGMOVE 186 XEQ "Q*Q" 187 STO IND 00 188 CLX |
189 SIGN
190 ST+ 00 191 X<>Y 192 STO IND 00 193 RDN 194 ST+ 00 195 X<>Y 196 STO IND 00 197 RDN 198 ST+ 00 199 X<>Y 200 STO IND 00 201 3 202 ST- 00 203 DSE 00 204 GTO 05 205 RCL 11 206 X<>Y 207 - 208 STO 00 209 LBL 06 210 RCL 09 211 STO 16 212 ENTER^ 213 FRC 214 RCL 00 215 INT 216 + 217 X=Y? 218 GTO 06 219 STO 17 220 INT 221 RCL 18 222 + 223 REGMOVE 224 LBL 07 225 RCL 16 226 INT 227 RCL 19 228 + 229 REGMOVE 230 XEQ "Q*Q" 231 ST- IND 17 232 CLX 233 SIGN 234 ST+ 17 235 X<>Y |
236 ST- IND 17
237 RDN 238 ST+ 17 239 X<>Y 240 ST- IND 17 241 RDN 242 ST+ 17 243 X<>Y 244 ST- IND 17 245 DSE 16 246 CLX 247 3 248 ST- 17 249 DSE 17 250 GTO 07 251 LBL 06 252 3 253 ST- 00 254 DSE 00 255 GTO 06 256 LBL 00 257 3 258 ST- 09 259 RCL 10 260 ST- 11 261 RCL 11 262 RCL 09 263 1 264 - 265 X<=Y? 266 CLX 267 DSE X 268 GTO 01 269 RCL 12 270 X^2 271 RCL 13 272 X^2 273 + 274 RCL 14 275 X^2 276 + 277 RCL 15 278 X^2 279 + 280 STO 00 281 END |
( 411 bytes / SIZE 21+4n.m )
STACK | INPUTS | OUTPUTS |
Y | n | / |
X | m | | ProdPiv |2 |
where n = number of rows , m = number of columns
& | ProdPiv
|2 is the square of the magnitude of a product of all
the pivots.
Example1: Find 3 quaternions u , v , w such that
1 + 2 i + 3 j + 4 k = ( 2 + 3 i + j + 2 k ) u + (
1 + 3 i + 4 j + 2 k ) v + ( 3 + 4 i + 2 j + k ) w
2 + i + 4 j + 3 k = ( 1 + 2 i
+ j + 3 k ) u + ( 2 + i + 3 j + 2 k ) v + ( 2 + 3 i + 4 j +
5 k ) w
3 + 4 i + 2 j + k = ( 3 + 4 i
+ 5 j + 6 k ) u + ( 4 + 2 i + 3 j + 4 k ) v + ( 1 + 2 i + 3 j + 4 k ) w
-Store these 48 integers in the same order as above into
R21 R22 R23 R24 R33
R34 R35 R36 R45 R46 R47
R48 R57 R58 R59 R60
R25 R26 R27 R28 R37
R38 R39 R40 R49 R50 R51
R52 R61 R62 R63 R64
R29 R30 R31 R32 R41
R42 R43 R44 R53 R54 R55
R56 R65 R66 R67 R68
CF 00 CF 01 CF 02
-There are 3 rows & 4 columns, so:
3 ENTER^
4 XEQ "QLS" >>>> 19782 =
R00
---Execution time = 78s---
-Since R00 # 0 , there is a unique solution ( u , v , w ) in registers R21 thru R32:
u = -0.398544131 + 0.660903352 i - 0.558993024
j + 0.824992418 k
v = 1.079162875 - 0.798604791 i + 0.672732787
j - 0.722171672 k
( rounded to 9D )
w = 0.462996664 - 0.098422809 i - 0.377767668
j - 0.104185624 k
-"The" product of the pivots, in registers R12 thru R15 is
ProdPiv = -6.096844948 - 66.21646089 i - 123.5648833 j + 9.587928679 k
-This is not really a determinant, except if all the coefficients
of the matrix A are complex numbers - in this case R14 = R15 = 0
-Otherwise, you'll get different results if there is other - or no
- permutations of the rows !
-Registers R33 to R68 now contain the Identity matrix, with very small
numbers instead of zero sometime...
Example2: If you want to solve the similar system ( same coefficients but different order for the products )
1 + 2 i + 3 j + 4 k = u ( 2 + 3 i + j + 2 k )
+ v ( 1 + 3 i + 4 j + 2 k ) + w ( 3 + 4 i + 2 j + k )
2 + i + 4 j + 3 k = u ( 1 + 2
i + j + 3 k ) + v ( 2 + i + 3 j + 2 k ) + w ( 2 + 3 i
+ 4 j + 5 k )
3 + 4 i + 2 j + k = u ( 3 + 4
i + 5 j + 6 k ) + v ( 4 + 2 i + 3 j + 4 k ) + w ( 1 + 2 i + 3 j + 4 k )
-Store the same coefficients into the same registers ( R21 thru R68 )
SF 02
3 ENTER^
4 R/S
>>>> 45542 = R00 # 0
-The solution is also unique and we find in registers R21 thru R32
u = -0.204075359 - 0.409029028 i + 0.185499100
j - 0.192569496 k
v = 0.781696017 + 0.824864960 i - 0.006762988
j - 0.118791445 k
( rounded to 9D )
w = 0.170721532 - 0.247441922 i - 0.104189539
j + 0.300623600 k
-And the product of the pivots, in registers R12 thru R15 is now
ProdPiv = -11.66262622 - 103.0309765 i -
113.7225589 j - 147.8437711 k
Notes:
-The execution times above are obtained if on uses M-Code routines Q*Q
and 1/Q to compute the multiplication and the inverse of quaternions.
-The focal routines "Q*Q" & "1/Q" are of course a little slower...
-Since calculating the "quasideterminant" is not essential here, we
may compute the square of its module only.
-On the other hand, it's more natural to store the coefficients into
R01 thru R4n.m and to get the results in the same registers.
-The following variant does that:
Data Registers: R00 = | ProdPiv |2 ( Registers R01 thru R4nm are to be initialized before executing "QLS" )
• R01 to R04 = p1,1
................................... • R4n(m-1)+1
to R4n(m-1)+4 = p1,m
........................................................................................................................
• R4n-3 to R4n = pn,1 .................................... • R4n.m-3 to R4n.m = pn,m
Flags: F00-F01-F02
CF 00 A pivot is regarded as 0 if it's smaller than
E-7 ( line 126 )
SF 00 Only 0 is regarded as 0
CF 01 Partial pivoting
SF 01 No Pivoting ( not recommended in general,
with a few exceptions however )
CF 02 B = A Q is solved
SF 02 B = Q A is solved
Subroutines: "Q*Q" & "1/Q" ( cf "Quaternions for the HP-41" )
-Lines 145 and 256 are three-byte GTOs
01 LBL "QLS"
02 RCL Y 03 RCL Y 04 * 05 25 E4 06 / 07 1.018 08 + 09 REGMOVE 10 STO 17 11 X<> Z 12 .1 13 % 14 + 15 STO 10 16 ST* Y 17 FRC 18 - 19 STO 11 20 1 21 STO 00 22 LASTX 23 % 24 RCL Z 25 INT 26 + 27 4 28 ST* 10 29 ST* 11 30 * 31 .017 32 ST- 17 33 17 34 ST+ 17 35 + 36 ST+ 11 37 + 38 3 39 - 40 .001004 41 RCL X 42 .004 43 + 44 FS? 02 |
45 X<>Y
46 STO 13 47 X<>Y 48 STO 12 49 R^ 50 LBL 01 51 STO 09 52 FS? 01 53 GTO 00 54 INT 55 RCL 11 56 FRC 57 + 58 STO 14 59 3 60 ST+ 14 61 CLX 62 LBL 02 63 RCL IND 14 64 X^2 65 DSE 14 66 RCL IND 14 67 X^2 68 + 69 DSE 14 70 RCL IND 14 71 X^2 72 + 73 DSE 14 74 RCL IND 14 75 X^2 76 + 77 X<=Y? 78 GTO 02 79 RCL 14 80 X<>Y 81 ENTER^ 82 LBL 02 83 RDN 84 DSE 14 85 GTO 02 86 RCL 09 87 ENTER^ 88 STO 01 |
89 FRC
90 R^ 91 INT 92 + 93 X=Y? 94 GTO 00 95 STO 02 96 LBL 03 97 4 98 RCL 01 99 RCL 02 100 LBL 04 101 RCL IND X 102 X<> IND Z 103 STO IND Y 104 CLX 105 SIGN 106 ST+ Z 107 + 108 DSE Z 109 GTO 04 110 DSE 01 111 CLX 112 DSE 02 113 GTO 03 114 LBL 00 115 RCL 12 116 RCL 09 117 INT 118 + 119 REGMOVE 120 RCL 13 121 LASTX 122 + 123 REGMOVE 124 CLX 125 FC? 00 126 E-7 127 RCL 01 128 X^2 129 RCL 02 130 X^2 131 + 132 RCL 03 |
133 X^2
134 + 135 RCL 04 136 X^2 137 + 138 ST* 00 139 SQRT 140 X<=Y? 141 CLX 142 X=0? 143 STO 00 144 X=0? 145 GTO 00 146 RCL 12 147 5 148 + 149 REGMOVE 150 RCL 04 151 RCL 03 152 RCL 02 153 RCL 01 154 XEQ "1/Q" 155 STO 01 156 RDN 157 STO 02 158 RDN 159 STO 03 160 X<>Y 161 STO 04 162 RCL 12 163 1 164 + 165 REGMOVE 166 RCL 09 167 STO 14 168 LBL 05 169 RCL 14 170 INT 171 RCL 13 172 + 173 REGMOVE 174 XEQ "Q*Q" 175 STO IND 14 176 CLX |
177 SIGN
178 ST+ 14 179 X<>Y 180 STO IND 14 181 RDN 182 ST+ 14 183 X<>Y 184 STO IND 14 185 RDN 186 ST+ 14 187 X<>Y 188 STO IND 14 189 3 190 ST- 14 191 DSE 14 192 GTO 05 193 RCL 11 194 X<>Y 195 - 196 STO 14 197 LBL 06 198 RCL 09 199 ENTER^ 200 STO 15 201 FRC 202 RCL 14 203 INT 204 + 205 X=Y? 206 GTO 06 207 STO 16 208 INT 209 RCL 12 210 + 211 REGMOVE 212 LBL 07 213 RCL 15 214 INT 215 RCL 13 216 + 217 REGMOVE 218 XEQ "Q*Q" 219 ST- IND 16 220 CLX |
221 SIGN
222 ST+ 16 223 X<>Y 224 ST- IND 16 225 RDN 226 ST+ 16 227 X<>Y 228 ST- IND 16 229 RDN 230 ST+ 16 231 X<>Y 232 ST- IND 16 233 DSE 15 234 CLX 235 3 236 ST- 16 237 DSE 16 238 GTO 07 239 LBL 06 240 3 241 ST- 14 242 DSE 14 243 GTO 06 244 LBL 00 245 3 246 ST- 09 247 RCL 10 248 ST- 11 249 RCL 11 250 RCL 09 251 1 252 - 253 X<=Y? 254 CLX 255 DSE X 256 GTO 01 257 RCL 17 258 REGMOVE 259 RCL 00 260 END |
( 387 bytes / SIZE 4n.m+18 )
STACK | INPUTS | OUTPUTS |
Y | n | / |
X | m | | ProdPiv |2 |
where n = number of rows , m = number of columns
& | ProdPiv
|2 is the square of the magnitude of a product of all
the pivots.
-In example 1, the same results are in obtained in 76 seconds instead of 78.
Notes:
-If all the coefficients of the matrix A are integers, X-output = R00
will be an integer too.
-If you prefer to get | ProdPiv | instead of | ProdPiv |2
, replace lines 138-139 by SQRT ST* 00