comparison scripts/linear-algebra/qzhess.m @ 2303:5cffc4b8de57

[project @ 1996-06-24 09:15:24 by jwe]
author jwe
date Mon, 24 Jun 1996 09:15:24 +0000
parents 5d29638dd524
children 2b5788792cad
comparison
equal deleted inserted replaced
2302:470c856bf55a 2303:5cffc4b8de57
1 # Copyright (C) 1996 John W. Eaton 1 ### Copyright (C) 1996 John W. Eaton
2 # 2 ###
3 # This file is part of Octave. 3 ### This file is part of Octave.
4 # 4 ###
5 # Octave is free software; you can redistribute it and/or modify it 5 ### Octave is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by the 6 ### under the terms of the GNU General Public License as published by
7 # Free Software Foundation; either version 2, or (at your option) any 7 ### the Free Software Foundation; either version 2, or (at your option)
8 # later version. 8 ### any later version.
9 # 9 ###
10 # Octave is distributed in the hope that it will be useful, but WITHOUT 10 ### Octave is distributed in the hope that it will be useful, but
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 ### WITHOUT ANY WARRANTY; without even the implied warranty of
12 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # for more details. 13 ### General Public License for more details.
14 # 14 ###
15 # You should have received a copy of the GNU General Public License 15 ### You should have received a copy of the GNU General Public License
16 # along with Octave; see the file COPYING. If not, write to the Free 16 ### along with Octave; see the file COPYING. If not, write to the Free
17 # Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 ### Software Foundation, 59 Temple Place - Suite 330, Boston, MA
18 ### 02111-1307, USA.
18 19
19 function [aa, bb, q, z] = qzhess (a, b) 20 function [aa, bb, q, z] = qzhess (a, b)
20 21
21 # Usage: [aa, bb, q, z] = qzhess (a, b) 22 ## Usage: [aa, bb, q, z] = qzhess (a, b)
22 # 23 ##
23 # Compute the qz decomposition of the matrix pencil (a - lambda b) 24 ## Compute the qz decomposition of the matrix pencil (a - lambda b)
24 # 25 ##
25 # result: (for Matlab compatibility): 26 ## result: (for Matlab compatibility):
26 # 27 ##
27 # aa = q*a*z and bb = q*b*z, with q, z orthogonal, and 28 ## aa = q*a*z and bb = q*b*z, with q, z orthogonal, and
28 # v = matrix of generalized eigenvectors. 29 ## v = matrix of generalized eigenvectors.
29 # 30 ##
30 # This ought to be done in a compiled program 31 ## This ought to be done in a compiled program
31 # 32 ##
32 # Algorithm taken from Golub and Van Loan, Matrix Computations, 2nd ed. 33 ## Algorithm taken from Golub and Van Loan, Matrix Computations, 2nd ed.
33 34
34 # Written by A. S. Hodel (scotte@eng.auburn.edu) August 1993. 35 ## Written by A. S. Hodel (scotte@eng.auburn.edu) August 1993.
35 36
36 if (nargin != 2) 37 if (nargin != 2)
37 error ("usage: [aa, bb, q, z] = qzhess (a, b)"); 38 error ("usage: [aa, bb, q, z] = qzhess (a, b)");
38 endif 39 endif
39 40
41 [nb, mb] = size (b); 42 [nb, mb] = size (b);
42 if (na != ma || na != nb || nb != mb) 43 if (na != ma || na != nb || nb != mb)
43 error ("qzhess: incompatible dimensions"); 44 error ("qzhess: incompatible dimensions");
44 endif 45 endif
45 46
46 # Reduce to hessenberg-triangular form. 47 ## Reduce to hessenberg-triangular form.
47 48
48 [q, bb] = qr (b); 49 [q, bb] = qr (b);
49 aa = q' * a; 50 aa = q' * a;
50 q = q'; 51 q = q';
51 z = eye (na); 52 z = eye (na);
52 for j = 1:(na-2) 53 for j = 1:(na-2)
53 for i = na:-1:(j+2) 54 for i = na:-1:(j+2)
54 55
55 # disp (["zero out aa(", num2str(i), ",", num2str(j), ")"]) 56 ## disp (["zero out aa(", num2str(i), ",", num2str(j), ")"])
56 57
57 rot = givens (aa (i-1, j), aa (i, j)); 58 rot = givens (aa (i-1, j), aa (i, j));
58 aa ((i-1):i, :) = rot *aa ((i-1):i, :); 59 aa ((i-1):i, :) = rot *aa ((i-1):i, :);
59 bb ((i-1):i, :) = rot *bb ((i-1):i, :); 60 bb ((i-1):i, :) = rot *bb ((i-1):i, :);
60 q ((i-1):i, :) = rot *q ((i-1):i, :); 61 q ((i-1):i, :) = rot *q ((i-1):i, :);
61 62
62 # disp (["now zero out bb(", num2str(i), ",", num2str(i-1), ")"]) 63 ## disp (["now zero out bb(", num2str(i), ",", num2str(i-1), ")"])
63 64
64 rot = givens (bb (i, i), bb (i, i-1))'; 65 rot = givens (bb (i, i), bb (i, i-1))';
65 bb (:, (i-1):i) = bb (:, (i-1):i) * rot'; 66 bb (:, (i-1):i) = bb (:, (i-1):i) * rot';
66 aa (:, (i-1):i) = aa (:, (i-1):i) * rot'; 67 aa (:, (i-1):i) = aa (:, (i-1):i) * rot';
67 z (:, (i-1):i) = z (:, (i-1):i) * rot'; 68 z (:, (i-1):i) = z (:, (i-1):i) * rot';