diff matrixcomp/fv.m @ 0:8f23314345f4 draft

Create local repository for matrix toolboxes. Step #0 done.
author Antonio Pino Robles <data.script93@gmail.com>
date Wed, 06 May 2015 14:56:53 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matrixcomp/fv.m	Wed May 06 14:56:53 2015 +0200
@@ -0,0 +1,101 @@
+function [f, e] = fv(B, nk, thmax, noplot)
+%FV     Field of values (or numerical range).
+%       FV(A, NK, THMAX) evaluates and plots the field of values of the
+%       NK largest leading principal submatrices of A, using THMAX
+%       equally spaced angles in the complex plane.
+%       The defaults are NK = 1 and THMAX = 16.
+%       (For a `publication quality' picture, set THMAX higher, say 32.)
+%       The eigenvalues of A are displayed as `x'.
+%       Alternative usage: [F, E] = FV(A, NK, THMAX, 1) suppresses the
+%       plot and returns the field of values plot data in F, with A's
+%       eigenvalues in E.   Note that NORM(F,INF) approximates the
+%       numerical radius,
+%                 max {abs(z): z is in the field of values of A}.
+
+%       Theory:
+%       Field of values FV(A) = set of all Rayleigh quotients. FV(A) is a
+%       convex set containing the eigenvalues of A.  When A is normal FV(A) is
+%       the convex hull of the eigenvalues of A (but not vice versa).
+%               z = x'Ax/(x'x),  z' = x'A'x/(x'x)
+%               => REAL(z) = x'Hx/(x'x),   H = (A+A')/2
+%       so      MIN(EIG(H)) <= REAL(z) <= MAX(EIG(H)),
+%       with equality for x = corresponding eigenvectors of H.  For these x,
+%       RQ(A,x) is on the boundary of FV(A).
+%
+%       Based on an original routine by A. Ruhe.
+%
+%       References:
+%       R. A. Horn and C. R. Johnson, Topics in Matrix Analysis, Cambridge
+%            University Press, 1991; sec. 1.5.
+%       A. S. Householder, The Theory of Matrices in Numerical Analysis,
+%            Blaisdell, New York, 1964; sec. 3.3.
+%       C. R. Johnson, Numerical determination of the field of values of a
+%            general complex matrix, SIAM J. Numer. Anal., 15 (1978),
+%            pp. 595-602.
+
+if nargin < 2 | isempty(nk), nk = 1; end
+if nargin < 3 | isempty(thmax), thmax = 16; end
+thmax = thmax - 1;  % Because code below uses thmax + 1 angles.
+
+iu = sqrt(-1);
+[n, p] = size(B);
+if n ~= p, error('Matrix must be square.'), end
+f = [];
+z = zeros(2*thmax+1,1);
+e = eig(B);
+
+% Filter out cases where B is Hermitian or skew-Hermitian, for efficiency.
+if isequal(B,B')
+
+   f = [min(e) max(e)];
+
+elseif isequal(B,-B')
+
+   e = imag(e);
+   f = [min(e) max(e)];
+   e = iu*e; f = iu*f;
+
+else
+
+for m = 1:nk
+
+   ns = n+1-m;
+   A = B(1:ns, 1:ns);
+
+   for i = 0:thmax
+      th = i/thmax*pi;
+      Ath = exp(iu*th)*A;               % Rotate A through angle th.
+      H = 0.5*(Ath + Ath');             % Hermitian part of rotated A.
+      [X, D] = eig(H);
+      [lmbh, k] = sort(real(diag(D)));
+      z(1+i) = rq(A,X(:,k(1)));         % RQ's of A corr. to eigenvalues of H
+      z(1+i+thmax) = rq(A,X(:,k(ns)));  % with smallest/largest real part.
+   end
+
+   f = [f; z];
+
+end
+% Next line ensures boundary is `joined up' (needed for orthogonal matrices).
+f = [f; f(1,:)];
+
+end
+if thmax == 0; f = e; end
+
+if nargin < 4
+
+   ax = cpltaxes(f);
+   plot(real(f), imag(f))      % Plot the field of values
+   axis(ax);
+   axis('square');
+
+   hold on
+   plot(real(e), imag(e), 'x')    % Plot the eigenvalues too.
+   hold off
+
+end
+
+function z = rq(A,x)
+%RQ      Rayleigh quotient.
+%        RQ(A,x) is the Rayleigh quotient of A and x, x'*A*x/(x'*x).
+
+z = x'*A*x/(x'*x);