# HG changeset patch # User Jordi GutiƩrrez Hermoso # Date 1345133525 14400 # Node ID 3a33f93c9e62937a69cb920b2f3adb7cfd7de4f2 # Parent 82d51d6e470c23c748a53a6fd8b82c3d5e7e1614# Parent 045ae93e8fe9a7b4b2ddd1b66caa36a4129bb7a7 Merge in polyeig diff -r 82d51d6e470c -r 3a33f93c9e62 NEWS --- a/NEWS Tue Aug 14 15:54:43 2012 -0400 +++ b/NEWS Thu Aug 16 12:12:05 2012 -0400 @@ -82,11 +82,10 @@ ** Other new functions added in 3.8.0: - betaincinv erfcinv splinefit - cmpermute findfigs tetramesh - cmunique fminsearch rgbplot - colorcube lines shrinkfaces - + betaincinv erfcinv polyeig shrinkfaces + cmpermute findfigs splinefit + cmunique fminsearch tetramesh + colorcube lines rgbplot ** Deprecated functions. The following functions were deprecated in Octave 3.4 and have been diff -r 82d51d6e470c -r 3a33f93c9e62 doc/interpreter/poly.txi --- a/doc/interpreter/poly.txi Tue Aug 14 15:54:43 2012 -0400 +++ b/doc/interpreter/poly.txi Thu Aug 16 12:12:05 2012 -0400 @@ -84,6 +84,8 @@ @DOCSTRING(roots) +@DOCSTRING(polyeig) + @DOCSTRING(compan) @DOCSTRING(mpoles) diff -r 82d51d6e470c -r 3a33f93c9e62 scripts/help/unimplemented.m --- a/scripts/help/unimplemented.m Tue Aug 14 15:54:43 2012 -0400 +++ b/scripts/help/unimplemented.m Thu Aug 16 12:12:05 2012 -0400 @@ -310,7 +310,6 @@ "plotbrowser", "plotedit", "plottools", - "polyeig", "prefdir", "preferences", "printdlg", diff -r 82d51d6e470c -r 3a33f93c9e62 scripts/polynomial/polyeig.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/polynomial/polyeig.m Thu Aug 16 12:12:05 2012 -0400 @@ -0,0 +1,84 @@ +## Copyright (C) 2012 Fotios Kasolis +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{z} =} polyeig (@var{C0}, @var{C1}, @dots{}, @var{Cl}) +## @deftypefnx {Function File} {[ @var{v}, @var{z} ] =} polyeig (@var{C0}, @var{C1}, @dots{}, @var{Cl}) +## Solve the polynomial eigenvalue problem of degree @var{l}. +## +## Given a @var{n*n} matrix polynomial @var{C(s)} = @var{C0 + C1 s + @dots{} + Cl s^l} polyeig +## solves the eigenvalue problem (@var{C0} + @var{C1} + @dots{} + @var{Cl})v = 0. +## Note that the eigenvalues @var{z} are the zeros of the matrix polynomial. @var{z} is a +## @var{lxn} vector and @var{v} is a @var{(n x n)l} matrix with columns that correspond to +## the eigenvectors. +## @seealso{eig, eigs, compan} +## @end deftypefn + +## Author: Fotios Kasolis + +function [ z, varargout ] = polyeig (varargin) + + if ( nargout > 2 ) + print_usage (); + endif + + nin = numel (varargin); + + n = zeros (1, nin); + + for cnt = 1 : nin + if ! ( issquare (varargin{cnt}) ) + error ("polyeig: coefficients must be square matrices"); + endif + n(cnt) = size (varargin{cnt}, 1); + endfor + + if numel (unique (n)) > 1 + error ("polyeig: coefficients must have the same dimensions"); + endif + n = unique (n); + + # matrix polynomial degree + l = nin - 1; + + # form needed matrices + C = [ zeros(n * (l - 1), n), eye(n * (l - 1)); -cell2mat(varargin(1 : end - 1)) ]; + D = [ eye(n * (l - 1)), zeros(n * (l - 1), n); zeros(n, n * (l - 1)), varargin{end} ]; + + % solve generalized eigenvalue problem + if ( isequal (nargout, 1) ) + z = eig (C, D); + else + [ z, v ] = eig (C, D); + varargout{1} = v; + % return n-element eigenvectors normalized so + % that the infinity-norm = 1 + z = z(1:n,:); + % max() takes the abs if complex: + t = max(z); + z /= diag(t); + endif + +endfunction + +%!test +%! C0 = [8, 0; 0, 4]; C1 = [1, 0; 0, 1]; +%! [v,z] = polyeig (C0, C1); +%! assert (isequal (z(1), -8), true); +%! d = C0*v + C1*v*z +%! assert (isequal (norm(d), 0.0), true);