When working with medium- to high-order systems (10+ states), avoid the transfer function form and use the state-space form whenever possible. Computations involving high-order transfer functions often result in severe loss of accuracy, and even overflow. Even a simple product of two transfer functions can give surprising results, as shown below.
Start with two discrete-time transfer functions Pd and Cd of order 9 and 2, respectively. Their frequency responses are plotted above.
load numdemo % load Pd,Cd models bode(Pd,'b',Cd,'r') h = gcr; title('Bode diagram of Pd (blue) and Cd (red)'); set(h.AxesGrid,'XUnits','rad/sec','YUnits',{'dB';'deg'}); ax = getaxes(h.AxesGrid); set(ax,'Xlim',[0.1 1e6]); set(ax(1),'Ylim',[-100 100]); set(ax(2),'Ylim',[-540 180]);
Next compute the product L = Pd*Cd (series connection) three different ways and compare the frequency responses:
Ltf = Pd * Cd; % transfer function product Lzp = zpk(Pd) * Cd; % zero-pole-gain product Lss = ss(Pd) * Cd; % state space product bode(Ltf,'g',Lzp,'b',Lss,'r-.',{1e-1,1e3}) h = gcr; title('Bode diagram of Ltf (green), Lzp (blue), and Lss (red dash)'); set(h.AxesGrid,'XUnits','rad/sec','YUnits',{'dB';'deg'}); ax = getaxes(h.AxesGrid); set(ax(1),'Ylim',[-20 120]); set(ax(2),'Ylim',[-180 0]);
The responses of the state-space and zero-pole-gain products match, but the response of the transfer function product Ltf is choppy and erratic below 100 rad/sec.
To explain the loss of accuracy with the transfer function form, compare the pole/zero maps of Pd and Cd near z=1:
pzmap(Pd,'b',Cd,'r') h = gcr; title('Pole/zero maps of Pd (blue) and Cd (red)'); h.AxesGrid.setxlim([0 1.05]); h.AxesGrid.setylim([-1 1]);
Note the multiple roots near z=1. Because the relative accuracy of polynomial values drops near roots, the relative error on the transfer function value near z=1 ends up exceeding 100%. Observing that frequencies below 100 rad/s map to z-1<1e-3, this explains the erratic results below 100 rad/s.
Moral: Compute with the state-space form and avoid combining transfer functions.