0001
0002
0003
0004
0005 function [A,B,Q,Z] = qzswitch(i,A,B,Q,Z)
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 realsmall=sqrt(eps)*10;
0017
0018 a = A(i,i); d = B(i,i); b = A(i,i+1); e = B(i,i+1);
0019 c = A(i+1,i+1); f = B(i+1,i+1);
0020
0021
0022 if (abs(c)<realsmall & abs(f)<realsmall)
0023 if abs(a)<realsmall
0024
0025 return
0026 else
0027
0028 wz=[b; -a];
0029 wz=wz/sqrt(wz'*wz);
0030 wz=[wz [wz(2)';-wz(1)'] ];
0031 xy=eye(2);
0032 end
0033 elseif (abs(a)<realsmall & abs(d)<realsmall)
0034 if abs(c)<realsmall
0035
0036 return
0037 else
0038
0039 wz=eye(2);
0040 xy=[c -b];
0041 xy=xy/sqrt(xy*xy');
0042 xy=[[xy(2)' -xy(1)'];xy];
0043 end
0044 else
0045
0046 wz = [c*e-f*b, (c*d-f*a)'];
0047 xy = [(b*d-e*a)', (c*d-f*a)'];
0048 n = sqrt(wz*wz');
0049 m = sqrt(xy*xy');
0050 if m<eps*100
0051
0052 return
0053 end
0054 wz = n\wz;
0055 xy = m\xy;
0056 wz = [wz; -wz(2)', wz(1)'];
0057 xy = [xy;-xy(2)', xy(1)'];
0058 end
0059 A(i:i+1,:) = xy*A(i:i+1,:);
0060 B(i:i+1,:) = xy*B(i:i+1,:);
0061 A(:,i:i+1) = A(:,i:i+1)*wz;
0062 B(:,i:i+1) = B(:,i:i+1)*wz;
0063 Z(:,i:i+1) = Z(:,i:i+1)*wz;
0064 Q(i:i+1,:) = xy*Q(i:i+1,:);