hp41programs

Householder

Householder Transformation for the HP-41


Overview
 

 1°)  Householder Algorithm
 2°)  A Modified Algorithm
 

-The 1st program uses the Householder method to triangularize one - or several - linear system(s)
-Then "TRS" is called to compute the solutions.

-In the 2nd program, the method is modified to diagonalize the principal matrix - if it is possible - so that the diagonal only contains "1"s
-No subroutine is needed in this case.

-In both cases, the elements are to be stored in column order, the right-hand side first.

     B = A.X
 

1°)  Householder Algorithm
 

-The Householder method uses orthogonal symmetries to gradually triangularize a matrix.

-If ( a1 , ...... , an ) is the first column of the matrix A,  the other columns  ( x1 , ...... , xn )  are replaced by  ( y1 , ...... , yn )  defined as

   ( y1 , ...... , yn ) = ( x1 , ...... , xn ) - C [ a1 + sgn(a1) ( a12 + ....... + an2 )1/2 , a2 , ...... , an ]

 where   C = [ SUMi=1,...,n ai xi + x1 sgn(a1) ( SUMi=1,...,n ai2 )1/2 ] / [ SUMi=1,...,n ai2 + a1 sgn(a1) ( SUMi=1,...,n ai2 )1/2 ]

-The first column becomes  ( A1 , 0 , .......... , 0 )   with   A1 = -sgn(a1) ( SUMi=1,...,n ai2 )1/2
-Then, the same process is repeated with the 2nd column, without taking into account the 1st column and the 1st raw, and so on...

-Actually, the program listed below starts with the last column and the last element, and then it continues with the next-to-last column and so on...
 

Data Registers:               R00 = Det A                               ( Registers R01 thru Rn.m are to be initialized before executing "HLS" )

                                      •  R01 = b1           •  Rn+1 = a1,1      .....................      •  Rnm-n+1 = a1,n
                                      •  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  and  the square matrix has become a lower triangular matrix.

 •  Of course, this program may be used to solve several linear systems with the same "principal" matrix,
    especially if you want to invert the square-matrix itself.

Flag:   F00

   CF 00 = we solve the linear system(s) except if det A = 0
   SF 00 = we stop when the array has only zeros above the "diagonal"

   F00 is automatically set if m <= n  ( overdetermined systems )

Subroutine:    "TRS"  ( cf "Triangular Systems for the HP-41" )

-Lines 51 & 143 are three-byte GTOs
-Line 72 is a TEXT0 or any other NOP instruction ( STO X .... )
 
 

  01  LBL "HLS" 
  02  X<=Y?
  03  SF 00
  04  X<>Y
  05  .1
  06  %
  07  +
  08  STO N
  09  ST* Y
  10  FRC
  11  -
  12  STO O
  13  1
  14  STO 00
  15  LASTX
  16  %
  17  RCL Z
  18  INT
  19  +
  20  LBL 01
  21  STO M
  22  INT
  23  RCL O
  24  FRC
  25  +
  26   E-6
  27  RCL O
  28  INT
  29  RCL N
  30  INT
  31  -
  32  STO P
  33  CLX
  34  LBL 02
  35  RCL IND Z
  36  X^2
  37  +
  38  DSE Z
  39  GTO 02
  40  SQRT
  41  RCL IND M
  42  SIGN
  43  *
  44  STO Q
  45  ABS
  46  X<=Y?
  47  CLX
  48  X=0?
  49  STO 00
  50  X=0?
  51  GTO 07
  52  LBL 03
  53  RCL P
  54  X=0?
  55  GTO 06
  56  RCL O
  57  INT
  58  ST- P
  59  RCL M
  60  INT
  61  ST+ P
  62  RCL O
  63  FRC
  64  ST+ Y
  65  CLX
  66  LBL 04
  67  RCL IND Y
  68  RCL IND P
  69  *
  70  +
  71  DSE P
  72  ""
  73  DSE Y
  74  GTO 04
  75  RCL Q
  76  /
  77  RCL N
  78  RCL P
  79  +
  80  RCL M
  81  +
  82  INT
  83  RCL O
  84  INT
  85  -
  86  STO P
  87  X<>Y
  88  RCL IND Y
  89  +
  90  RCL IND M
  91  STO Z
  92  RCL Q
  93  ST+ IND M
  94  +
  95  /
  96  RCL M
  97  INT
  98  RCL O
  99  FRC
100  +
101  X<>Y
102  SIGN
103  LBL 05
104  CLX
105  RCL IND Y
106  LASTX
107  *
108  ST- IND P
109  DSE P
110  CLX
111  DSE Y
112  GTO 05
113  R^
114  STO IND M
115  GTO 03
116  LBL 06
117  RCL O
118  FRC
119  RCL M
120  INT
121  PI
122  INT
123  10^X
124  ST* Z
125  /
126  +
127  ISG X
128  CLRGX
129  RCL Q
130  ST* 00
131  CHS
132  STO IND M
133  LBL 07
134  RCL N
135  ST- O
136  RCL O
137  RCL M
138  1
139  -
140  X<=Y?
141  CLX
142  DSE X
143  GTO 01
144  RCL M
145  RCL N
146  INT
147  /
148  INT
149  RCL N
150  INT
151  RCL 00
152  CLA
153  FC? 00
154  X=0?
155  RTN
156  X<> Z
157  XEQ "TRS"
158  RCL 00
159  END

 
    ( 244 bytes / SIZE  1+n.m )
 
 

      STACK        INPUTS      OUTPUTS
           Y             n             /
           X             m         Det A

  where  n = number of raws
    and   m = number of columns

Example1:    The instructions are similar to those of "LS3"  ( cf "Linear & Non-Linear Systems for the HP-41" )

   -3 = 2 x + 3 y - 4 z              R01   R04   R07   R10
   21 = 4 x - 5 y + 7 z      =     R02   R05   R08   R11
   38 = 4 x + 2 y + 6 z            R03   R06   R09   R12

         CF 00
    3   ENTER^
    4   XEQ "HLS"   >>>>   Det =  -188                       ---Execution time = 26s---

   R01 = x = 2              R04   R07   R10          -3.6778         0            0
   R02 = y = 3    and    R05   R08   R11    =      1.8181    5.0864        0                   rounded to 4D
   R03 = z = 4              R06   R09   R12          -4.3782    3.4826   -10.0499

-Before calling "TRS", we had:

   R01 = -7.3556   R02 = 18.8953   R03 = -38.5079

Example2:    To invert the same matrix, store

   R01   R04   R07   R10   R13   R16         1    0    0    2    3   -4
   R02   R05   R08   R11   R14   R17   =    0    1    0    4   -5   7
   R03   R06   R09   R12   R15   R18         0    0    1    4    2    6

         CF 00
    3   ENTER^
    6   XEQ "HLS"   >>>>   Det =  -188                      ---Execution time = 47s---

   R01   R04   R07         11/47    13/94    -1/188
   R02   R05   R08   =    -1/47    -7/47      15/94          with small roundoff-errors as usual
   R03   R06   R09         -7/47    -2/47      11/94
 

Note:

-With n = 7 & m = 8, Execution time = 2mn39s
 

2°)  A Modified Algorithm
 

-A similar method may be used to diagonalize a matrix:

-After using the formulae mentionned above, the last raw of the matrix is divided by Am So, the last column is now ( 0 , ........... , 0 , 1 )
-And we continue in the same way with the other complete columns.
 
 

Data Registers:               R00 = Det A                             ( Registers R01 thru Rn.m are to be initialized before executing "HLS" )

                                      •  R01 = b1           •  Rn+1 = a1,1      .....................      •  Rnm-n+1 = a1,n
                                      •  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  and  the square matrix - if it's not singular - has become a Unit matrix.

 •  This program may also be used to solve several linear systems with the same "principal" matrix,
     especially if you want to invert the square-matrix itself.

Flags: /
Subroutines: /

-Lines 49 & 143 are three-byte GTOs
 
 

  01  LBL "HLS" 
  02  X<>Y
  03  .1
  04  %
  05  +
  06  STO N
  07  ST* Y
  08  FRC
  09  -
  10  STO O
  11  1
  12  STO 00
  13  LASTX
  14  %
  15  RCL Z
  16  INT
  17  +
  18  LBL 01
  19  STO M
  20  INT
  21  RCL O
  22  FRC
  23  +
  24   E-6
  25  RCL O
  26  INT
  27  RCL N
  28  INT
  29  -
  30  STO P
  31  CLX
  32  LBL 02
  33  RCL IND Z
  34  X^2
  35  +
  36  DSE Z
  37  GTO 02
  38  SQRT
  39  RCL IND M
  40  SIGN
  41  *
  42  STO Q
  43  ABS
  44  X<=Y?
  45  CLX
  46  X=0?
  47  STO 00
  48  X=0?
  49  GTO 08
  50  LBL 03
  51  RCL P
  52  X=0?
  53  GTO 06
  54  RCL O
  55  INT
  56  ST- P
  57  RCL M
  58  INT
  59  ST+ P
  60  RCL O
  61  FRC
  62  ST+ Y
  63  CLX
  64  LBL 04
  65  RCL IND Y
  66  RCL IND P
  67  *
  68  +
  69  DSE P
  70  ""
  71  DSE Y
  72  GTO 04
  73  RCL Q
  74  /
  75  RCL N
  76  INT
  77  ST+ P
  78  CLX
  79  RCL P
  80  RCL M
  81  +
  82  INT
  83  RCL O
  84  INT
  85  -
  86  X<>Y
  87  RCL IND Y
  88  +
  89  RCL IND M
  90  STO Z
  91  RCL Q
  92  ST+ IND M
  93  +
  94  /
  95  RCL O
  96  X<>Y
  97  SIGN
  98  LBL 05
  99  CLX
100  RCL IND Y
101  LASTX
102  *
103  ST- IND P
104  DSE P
105  CLX
106  DSE Y
107  GTO 05
108  R^
109  STO IND M
110  GTO 03
111  LBL 06
112  RCL O
113  INT
114  LASTX
115  FRC
116  PI
117  INT
118  10^X
119  ST/ Z
120  *
121  +
122  ISG X
123  CLRGX
124  RCL M
125  RCL Q
126  ST* 00
127  CHS
128  STO IND Y
129  LBL 07
130  ST/ IND Y
131  DSE Y
132  GTO 07
133  LBL 08
134  RCL N
135  ST- O
136  RCL O
137  RCL M
138  1
139  -
140  X<=Y?
141  CLX
142  DSE X
143  GTO 01
144  RCL 00
145  CLA
146  END

 
    ( 223 bytes / SIZE 1+n.m )
 
 

      STACK        INPUTS      OUTPUTS
           T             /          n.nnn
           Z             /             /
           Y             n            /
           X             m         Det A

  where  n = number of raws
    and   m = number of columns

Example1:

   -3 = 2 x + 3 y - 4 z              R01   R04   R07   R10
   21 = 4 x - 5 y + 7 z      =     R02   R05   R08   R11
   38 = 4 x + 2 y + 6 z            R03   R06   R09   R12

    3   ENTER^
    4   XEQ "HLS"   >>>>   Det =  -188                       ---Execution time = 25s---

   R01 = x = 2              R04   R07   R10           1    0    0
   R02 = y = 3    and    R05   R08   R11    =     0    1    0
   R03 = z = 4              R06   R09   R12           0    0    1

Example2:    To invert the same matrix, store

   R01   R04   R07   R10   R13   R16         1    0    0    2    3   -4
   R02   R05   R08   R11   R14   R17   =    0    1    0    4   -5   7
   R03   R06   R09   R12   R15   R18         0    0    1    4    2    6

    3   ENTER^
    6   XEQ "HLS"   >>>>   Det =  -188                       ---Execution time = 42s---

   R01   R04   R07         11/47    13/94    -1/188
   R02   R05   R08   =    -1/47    -7/47      15/94          with small roundoff-errors...
   R03   R06   R09         -7/47    -2/47      11/94

Notes:

-With n = 7 & m = 8, Execution time = 2mn50s
-The Householder method is very sound and no pivoting is needed.
-On the other hand, it's slower and roundoff-errors may be slightly larger than when using Gaussian elimination.
-"LS3" inverses the matrix above in 25 seconds instead of 42 !