www.gusucode.com > control_featured 案例源码程序 matlab代码 > control_featured/GSModelTypeConversions.m

    %% Switching Model Representation
% This example shows how to switch between the transfer function (TF),
% zero-pole-gain (ZPK), state-space (SS), and frequency response data (FRD)
% representations of LTI systems.

%   Copyright 1986-2012 The MathWorks, Inc.

%% Model Type Conversions
% You can convert models from one representation to another using the same
% commands that you use for constructing LTI models (|tf|, |zpk|, |ss|, and
% |frd|). For example, you can convert the state-space model:
sys = ss(-2,1,1,3);

%% 
% to a zero-pole-gain model by typing:
zpksys = zpk(sys)

%% 
% Similarly, you can calculate the transfer function of |sys| by typing:
tf(sys)

%%
% Conversions to FRD require a frequency vector:
f = logspace(-2,2,10);
frdsys = frd(sys,f)

%%
% Note that FRD models cannot be
% converted back to the TF, ZPK, or SS representations (such conversion 
% requires the frequency-domain identification tools available in
% System Identification).

%%
% All model type conversion paths are summarized in the diagram below.
%
% <<../GSModelTypeConversions_Fig01.png>>

%% Implicit Type Casting
% Some commands expect a specific type of LTI model.  For convenience,
% such commands automatically convert incoming LTI models to the appropriate representation.  
% For example, in the sample code:
sys = ss(0,1,1,0);
[num,den] = tfdata(sys,'v')

%%
% the function |tfdata| automatically converts the state-space model |sys| to an
% equivalent transfer function  to obtain its numerator and denominator data.

%% Caution About Switching Back and Forth Between Representations
% Conversions between the TF, ZPK, and SS representations involve numerical
% computations and can incur loss of accuracy when overused. Because the SS
% and FRD representations are best suited for numerical computations, it is
% good practice to convert all models to SS or FRD and only use 
% the TF and ZPK representations for construction or display purposes.
%
% For example, convert the ZPK model
G = zpk([],ones(10,1),1,0.1)

%%
% to TF and then back to ZPK:
G1 = zpk(tf(G));

%%
% Now compare the pole locations for |G| and |G1|:
G1 = zpk(tf(G));
pzmap(G,'b',G1,'r')
axis([0.5 1.5 -0.4 0.4])
legend('G','G1')

%%
% Observe how the pole of multiplicity 10 at |z=1| in |G| is replaced by a
% cluster of poles in |G1|. This occurs because the poles of
% |G1| are computed as the roots of the polynomial
%
% $$ (z-1)^{10} = z^{10} - 10 z^9 + 45 z^8 - 120 z^7 + 210 z^6 - 252 z^5 + 210
% z^4 - 120 z^3 + 45 z^2 - 10 z + 1 $$
%
% and an |o(eps)| error on the last coefficient of this polynomial is
% enough to move the roots by 
%
% $$ o( \epsilon ^{1/10}) = o(3 \times 10^{-2}) . $$
%
% In other words, the transfer function representation is not accurate enough to capture the
% system behavior near z=1, which is also visible in the Bode plot of |G| vs. |G1|:
bode(G,'b',G1,'r--'), grid
legend('G','G1')

%%
% This illustrates why you should avoid unnecessary model conversions.