diff matrixcomp/ps.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/ps.m	Wed May 06 14:56:53 2015 +0200
@@ -0,0 +1,90 @@
+function y = ps(A, m, tol, rl, marksize)
+%PS     Dot plot of a pseudospectrum.
+%       PS(A, M, TOL, RL) plots an approximation to a pseudospectrum
+%       of the square matrix A, using M random perturbations of size TOL.
+%       M defaults to a SIZE(A)-dependent value and TOL to 1E-3.
+%       RL defines the type of perturbation:
+%         RL =  0 (default): absolute complex perturbations of 2-norm TOL.
+%         RL =  1:           absolute real perturbations of 2-norm TOL.
+%         RL = -1:           componentwise real perturbations of size TOL.
+%       The eigenvalues of A are plotted as crosses `x'.
+%       PS(A, M, TOL, RL, MARKSIZE) uses the specified marker size instead
+%       of a size that depends on the figure size, the matrix order, and M.
+%       If MARKSIZE < 0, the plot is suppressed and the plot data is returned
+%       as an output argument.
+%       PS(A, 0) plots just the eigenvalues of A.
+
+%       For a given TOL, the pseudospectrum of A is the set of
+%       pseudo-eigenvalues of A, that is, the set
+%       { e : e is an eigenvalue of A+E, for some E with NORM(E) <= TOL }.
+%
+%       References:
+%       L. N. Trefethen, Computation of pseudospectra, Acta Numerica,
+%          8:247-295, 1999.
+%       L. N. Trefethen, Spectra and pseudospectra, in The Graduate
+%          Student's Guide to Numerical Analysis '98, M. Ainsworth,
+%          J. Levesley, and M. Marletta, eds., Springer-Verlag, Berlin,
+%          1999, pp. 217-250.
+
+if diff(size(A)), error('Matrix must be square.'), end
+n = length(A);
+
+if nargin < 5, marksize = 0; end
+if nargin < 4, rl = 0; end
+if nargin < 3, tol = 1e-3; end
+if nargin < 2 | isempty(m), m = 5*max(1, round( 25*exp(-0.047*n) )); end
+
+if m == 0
+   e = eig(A);
+   ax = cpltaxes(e);
+   plot(real(e), imag(e), 'x')
+   axis(ax), axis('square')
+   return
+end
+
+x = zeros(m*n,1);
+i = sqrt(-1);
+
+for j = 1:m
+   if rl == -1     % Componentwise.
+      dA = -ones(n) + 2*rand(n);   % Uniform random numbers on [-1,1].
+      dA = tol * A .* dA;
+   else
+      if rl == 0   % Complex absolute.
+         dA = randn(n) + i*randn(n);
+      else         % Real absolute.
+         dA = randn(n);
+      end
+      dA = tol/norm(dA)*dA;
+   end
+   x((j-1)*n+1:j*n) = eig(A + dA);
+end
+
+if marksize >= 0
+
+   ax = cpltaxes(x);
+   h = plot(real(x),imag(x),'.');
+   axis(ax), axis('square')
+
+   % Next block adapted from SPY.M.
+   if marksize == 0
+      units = get(gca,'units');
+      set(gca,'units','points');
+      pos = get(gca,'position');
+      nps = 2.4*sqrt(n*m);  % Factor based on number of pseudo-ei'vals plotted.
+      myguess = round(3*min(pos(3:4))/nps);
+      marksize = max(1,myguess);
+      set(gca,'units',units);
+   end
+
+   hold on
+   e = eig(A);
+   plot(real(e),imag(e),'x');
+   set(h,'markersize',marksize);
+   hold off
+
+else
+
+  y = x;
+
+end