In this paper, we collect a few fairly well known facts about the
numerical range and assemble them into an effective algorithm for
computing the numerical range of an n x n matrix. Particular
attention is paid to the case in which a line segment is embedded
in the boundary of the numerical range, a case in which multiplicity
is present. The result is a parametrization of the curve that forms
the boundary of the numerical range.
A Matlab implementation of the algorithm is appended below.
Download the
paper in PDF (Acrobat) format.
If you cannot use a PDF document, send email to ccowen@iupui.edu
% An Effective Algorithm for Calculating the Numerical Range
% Carl C. Cowen and Elad Harel
% Purdue University
%
% This script finds the numerical range of an n x n matrix by
% finding the real and imaginary parts of rotates of the matrix
% and finding the associated boundary point of that rotate by
% finding the largest eigenvalue of the real part and using the
% corresponding eigenvector's contribution to the numerical range.
% Multiplicity of the largest eigenvalue, as occurs in a normal
% matrix, is handled by plotting the end points of the corresponding
% segment in the boundary of the numerical range.
%
A=input('For what matrix do you want the numerical range? ')
nm=ceil(norm(A));
th=[0:.01:6.29];
k=1;
w=zeros(1,630);
for j=1:630
Ath=(exp(i*(-th(j))))*A;
Hth=(Ath+Ath')/2;
[r e]=eig(Hth);
e=real(diag(e));
m=max(e);
s=find(e==m);
if size(s,1)==1
w(k)=r(:,s)'*A*r(:,s);
%
% This is the point of the numerical range contributed by
% v_t=r(:,s) when the eigenspace of Hth (H_t) is one dimensional.
%
else
Kth=i*(Hth-Ath);
pKp=r(:,s)'*Kth*r(:,s);
%
% The matrix Q described above is r(:,s)
%
[rr ee]=eig(pKp);
ee=real(diag(ee));
mm=min(ee);
sm=find(ee==mm);
temp=rr(:,sm(:,1))'*r(:,s)'*A*r(:,s)*rr(:,sm(:,1));
w(k)=temp(1,1);
%
% This is the point of the numerical range contributed by
% v_t^- = r(:,s)*rr(:,sm(:,1))
%
k=k+1;
mM=max(ee);
sM=find(ee==mM);
temp=rr(:,sM(:,1))'*r(:,s)'*A*r(:,s)*rr(:,sM(:,1));
w(k)=temp(1,1);
%
% This is the point of the numerical range contributed by v_t^+
%
end
k=k+1;
end
fill(real(w),imag(w),'y')
axis([-nm,nm,-nm,nm])
axis('equal')