www.gusucode.com > robust 案例源码程序 matlab代码 > robust/UsingModalAlgorithmsExample.m

    %% Using Modal Algorithms
% 
%% Rigid Body Dynamics
% In many cases, a model's $j\omega$-axis poles are important to keep after
% model reduction, e.g., rigid body dynamics of a flexible structure plant
% or integrators of a controller. A unique routine, |modreal|, serves the
% purpose nicely.
%
% |modreal| puts a system into its modal form, with eigenvalues appearing
% on the diagonal of its A-matrix. Real eigenvalues appear in 1-by-1
% blocks, and complex eigenvalues appear in 2-by-2 real blocks. All the
% blocks are ordered in ascending order, based on their eigenvalue
% magnitudes, by default, or descending order, based on their real parts.
% Therefore, specifying the number of $j\omega$-axis poles splits the model
% into two systems with one containing only $j\omega$-axis dynamics, the
% other containing the remaining dynamics.
rng(5678,'twister');  
G = rss(30,1,1);         % random 30-state model
[Gjw,G2] = modreal(G,1); % only one rigid body dynamics
G2.D = Gjw.D;            % put DC gain of G into G2
Gjw.D = 0; 
subplot(2,1,1)
sigma(Gjw)
ylabel('Rigid Body')
subplot(2,1,2)
sigma(G2)
ylabel('Nonrigid Body')
%%
% Further model reduction can be done on  |G2| without any numerical
% difficulty.  After |G2| is further reduced to |Gred|, the final
% approximation of the model is simply |Gjw+Gred|. 
%
% This process of splitting $j\omega$-axis poles has been built in and
% automated in all the model reduction routines |balancmr|, |schurmr|,
% |hankelmr|, |bstmr|, and |hankelsv|, so that users need not worry about
% splitting the model.
%%
% Examine the Hankel singular value plot. 
hankelsv(G)
%%
% Calculate an eighth-order reduced model. 
[gr,info] = reduce(G,8); 
figure
bode(G,'b-',gr,'r--')
legend('Original','Reduced')
%%
% The default algorithm |balancmr| of |reduce| has done a great job of
% approximating a 30-state model with just eight states. Again, the rigid
% body dynamics are preserved for further controller design.