%% 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.
% Copyright 2012 The MathWorks, Inc.