function [a,b,c,d]=pade(T,n)
% PADE  Returns an nth order Pade approximation to a time delay, T:
%	                    2           3
%	num    2 -Ts + (-Ts) /2! + (-Ts) /3! + ....
%	--- =  --------------------------- 
%	                   2          3            
%	den    2 +Ts + (Ts) /2! + (Ts) /3!+ .....
%
%	[NUM,DEN]=PADE(T,n)  returns the nth order pade approximation in
%	transfer function form where NUM and DEN contain the polynomial 
%	coefficients in descending powers of s.
%	
%	[A,B,C,D]=PADE(T,n)  returns the nth order pade approximation as
%	a continuous-time state-space system.
%
%	When invoked without lefthand arguments,
%		PADE(T,n)
%	plots the step response of an nth order Pade approximation on
%	the screen.
%
%	See also: C2DT.

%	Andrew C.W. Grace 8-13-89
%	Copyright (c) 1986-93 by the MathWorks, Inc.

% Next command sets the type of pade approximation to be used.
% Set ptype=0 for a smoother step response and low pass 
% filter characteristics, otherwise set ptype=1. 
ptype = 1;

% Polynomial series approximation of exp(-sT) (constant first)
series=1;
for i=1:2*n;
        series(i+1)=-series(i)*T/i;
end

% DENOMINATOR COEFFICIENTS
% First form a matrix to index appropriate elements of 'series'
C=zeros(n,n+1);
for i=1:n
	C(i,:)=i+ptype:n+i+ptype;
end
C(:)=series(C(:));

% Find b, a null vector of C,  so that C*b'=0 
[Q,R,E]=qr(C');
if min(size(R))>1 R=sum(R'); end
[dum,ind]=min(abs(R));
% Denominator solution
b=Q(:,ind).';


% NUMERATOR COEFFICIENTS
% Indexing matrix
C=zeros(n+1,n+1);
for i=1:n+1
	C(i,:)=-i+2:n+2-i;
end
% Address elements of series only for +ve elements of C
C(:)=series(C(:)+n*(C(:)<1))'.*(C(:)>0);
% Numerator solution
a=b*C.'; 

if ~ptype, a(1)=[]; end

% Graphical Output if no left hand arguments.
% Step Response and Bode Plots
if nargout==0
	clg
	hold off
	subplot(211)
	t1=[0:T/40:2*T];
	y1=step(a,b,t1);
	plot(t1,y1)
	hold off
	str=['st';'nd';'rd';'th']; str=str((n<4).*n+4*(n>3),:);
	title(['Step Response of ',num2str(n),'''',str,' order Pade Approx'])
	xlabel('Time (secs)')
	ylabel('Amplitude')
	[mag,phase,w]=bode(a,b);
	subplot(223)
	semilogx(w,20*log10(mag))
	xlabel('Frequency (rad/sec)')
	title('Gain response')
	ylabel('Gain dB')
	subplot(224)
	semilogx(w,phase)
	xlabel('Frequency (rad/sec)')
	ylabel('Phase deg')
	title('Phase response')
end
if nargout==4
	[a,b,c,d]=tf2ss(a,b);
elseif nargout==3
	[z,p,k]=tf2zp(a,b);
end
