# routh.m

### Edmundo Rivera-Santos (view profile)

• 1 file
• 4.82759

Returns the symbolic Routh array given a polynomial.

RA=routh(poli,epsilon);
```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

```