function RA=routh(poli,epsilon);
%ROUTH Routh array.
% RA=ROUTH(R,EPSILON) returns the symbolic Routh array RA for
% polynomial R(s). The following special cases are considered:
% 1) zero first elements and 2) rows of zeros. All zero first
% elements are replaced with the symbolic variable EPSILON
% which can be later substituted with positive and negative
% small numbers using SUBS(RA,EPSILON,...). When a row of
% zeros is found, the auxiliary polynomial is used.
%
% Examples:
%
% 1) Routh array for s^3+2*s^2+3*s+1
%
% >>syms EPS
% >>ra=routh([1 2 3 1],EPS)
% ra =
%
% 1.0000 3.0000
% 2.0000 1.0000
% 2.5000 0
% 1.0000 0
%
% 2) Routh array for s^3+a*s^2+b*s+c
%
% >>syms a b c EPS;
% >>ra=routh([1 a b c],EPS);
% ra =
%
% [ 1, b]
% [ a, c]
% [ (-c+b*a)/a, 0]
% [ c, 0]
%
%
% Author:Rivera-Santos, Edmundo J.
% E-mail:edmundo@alum.mit.edu
%
if(nargin<2),
fprintf('\nError: Not enough input arguments given.');
return
end
dim=size(poli); %get size of poli
coeff=dim(2); %get number of coefficients
RA=sym(zeros(coeff,ceil(coeff/2))); %initialize symbolic Routh array
for i=1:coeff,
RA(2-rem(i,2),ceil(i/2))=poli(i); %assemble 1st and 2nd rows
end
rows=coeff-2; %number of rows that need determinants
index=zeros(rows,1); %initialize columns-per-row index vector
for i=1:rows,
index(rows-i+1)=ceil(i/2); %form index vector from bottom to top
end
for i=3:coeff, %go from 3rd row to last
if(all(RA(i-1,:)==0)), %row of zeros
fprintf('\nSpecial Case: Row of zeros detected.');
a=coeff-i+2; %order of auxiliary equation
b=ceil(a/2)-rem(a,2)+1; %number of auxiliary coefficients
temp1=RA(i-2,1:b); %get auxiliary polynomial
temp2=a:-2:0; %auxiliry polynomial powers
RA(i-1,1:b)=temp1.*temp2; %derivative of auxiliary
elseif(RA(i-1,1)==0), %first element in row is zero
fprintf('\nSpecial Case: First element is zero.');
RA(i-1,1)=epsilon; %replace by epsilon
end
%compute the Routh array elements
for j=1:index(i-2),
RA(i,j)=-det([RA(i-2,1) RA(i-2,j+1);RA(i-1,1) RA(i-1,j+1)])/RA(i-1,1);
end
end