Main Content


Model order reduction


rsys = balred(sys,ORDERS)
rsys = balred(sys,ORDERS,BALDATA)
rsys = balred(___,opts)


rsys = balred(sys,ORDERS) computes a reduced-order approximation rsys of the LTI model sys. The desired order (number of states) for rsys is specified by ORDERS. You can try multiple orders at once by setting ORDERS to a vector of integers, in which case rsys is a vector of reduced-order models. balred uses implicit balancing techniques to compute the reduced- order approximation rsys. Use hsvd to plot the Hankel singular values and pick an adequate approximation order. States with relatively small Hankel singular values can be safely discarded.

When sys has unstable poles, it is first decomposed into its stable and unstable parts using stabsep, and only the stable part is approximated. Use balredOptions to specify additional options for the stable/unstable decomposition.

When you have System Identification Toolbox™ software installed, sys can only be an identified state-space model (idss). The reduced-order model is also an idss model.

rsys = balred(sys,ORDERS,BALDATA) uses balancing data returned by hsvd. Because hsvd does most of the work needed to compute rsys, this syntax is more efficient when using hsvd and balred jointly.

rsys = balred(___,opts) computes the model reduction using options that you specify using balredOptions. Options include offset and tolerance options for computing the stable-unstable decompositions. There also options for emphasizing particular time or frequency intervals. See balredOptions for details.


The order of the approximate model is always at least the number of unstable poles and at most the minimal order of the original model (number NNZ of nonzero Hankel singular values using an eps-level relative threshold)


collapse all

Compute a reduced-order approximation of the system given by:


Create the model.

sys = zpk([-.5 -1.1 -2.9],[-1e-6 -2 -1 -3],1);

Exclude the pole at s=10-6 from the stable term of the stable/unstable decomposition. To do so, set the Offset option of balredOptions to a value larger than the pole you want to exclude.

opt = balredOptions('Offset',.001,'StateElimMethod','Truncate');

Compute a second-order approximation.

rsys = balred(sys,2,opt);

Compare the responses of the original and reduced-order models.


Reduce a high-order model with a focus on the dynamics in a particular frequency range.

Load a model and examine its frequency response.


G is a 48th-order model with several large peak regions around 5.2 rad/s, 13.5 rad/s, and 24.5 rad/s, and smaller peaks scattered across many frequencies. Suppose that for your application you are only interested in the dynamics near the second large peak, between 10 rad/s and 22 rad/s. Focus the model reduction on the region of interest to obtain a good match with a low-order approximation. Use balredOptions to specify the frequency interval for balred.

bopt = balredOptions('StateElimMethod','Truncate','FreqIntervals',[10,22]);
GLim10 = balred(G,10,bopt);
GLim18 = balred(G,18,bopt);

Examine the frequency responses of the reduced-order models. Also, examine the difference between those responses and the original response (the absolute error).

title('Bode Magnitude Plot')
legend('Original','Order 10','Order 18');
title('Absolute Error Plot')
legend('Order 10','Order 18');

With the frequency-limited energy computation, even the 10th-order approximation is quite good in the region of interest.

Alternative Functionality

Live Editor Task

Reduce Model Order

Compatibility Considerations

expand all

Behavior changed in R2017b


[1] Varga, A., "Balancing-Free Square-Root Algorithm for Computing Singular Perturbation Approximations," Proc. of 30th IEEE CDC, Brighton, UK (1991), pp. 1062-1065.

Introduced before R2006a