# Approximate Model by Balanced Truncation at the Command Line

This example shows how to compute a reduced-order approximation of a model at the MATLAB® command line.

Balanced truncation removes the states with the lowest energy contribution to overall model behavior. Therefore, begin by examining the energy contribution of the model states. You choose the approximation order based on the number of states that make a significant contribution to the overall model behavior.

For this example, load a high-order model. hplant is a 23rd-order SISO model.

order(hplant)
ans =
23

Create a model order reduction task using reducespec.

R = reducespec(hplant,"balanced");

Examine the relative amount of energy per state in hplant using a Hankel singular-value (HSV) plot.

view(R)

Small Hankel singular values indicate that the associated states contribute little to the behavior of the system. The plot shows that two states account for most of the energy in the system. Therefore, try reducing the model to just first or second order using getrom.

hplant1 = getrom(R,Order=1,Method="Truncate");
hplant2 = getrom(R,Order=2,Method="Truncate");

The second argument to getrom specifies the target approximation order, so that hplant1 is a first-order approximation and hplant2 is a second-order approximation of hplant. By default, getrom discards the states with the smallest Hankel singular values, and alters the remaining states to preserve the DC gain of the system. Setting the Method option to "Truncate" causes getrom to discard low-energy states without altering the remaining states.

When working with reduced-order models, it is important to verify that the approximation does not introduce inaccuracies at frequencies that are important for your application. Therefore, compare the frequency responses of the original and approximated systems. For MIMO systems, use the sigmaplot command. For this SISO system, examine a Bode plot.

bodeplot(hplant,hplant2,hplant1)
legend('Original','2nd order','1st order')

ans =
Legend (Original, 2nd order, 1st order) with properties:

String: {'Original'  '2nd order'  '1st order'}
Location: 'northeast'
Orientation: 'vertical'
FontSize: 8.1000
Position: [0.7492 0.7863 0.2052 0.1278]
Units: 'normalized'

Use GET to show all properties

The second-order approximation hplant2 matches the original 23rd-order system very well, especially at lower frequencies. The first-order system does not match as well.

In general, as you decrease the order of the approximated model, the frequency response of the approximated model begins to differ from the original model. Choose an approximation that is sufficiently accurate in the bands that are important to you. For example, in a control system you might want good accuracy inside the control bandwidth. Accuracy at frequencies far above the control bandwidth, where the gain rapidly rolls off, might be less important.

You can also validate the approximation in the time domain. For instance, examine the step responses of the original and reduced-order systems.

stepplot(hplant,hplant2,'r--',hplant1,'g--')
legend('Original','2nd order','1st order','Location','SouthEast')

ans =
Legend (Original, 2nd order, 1st order) with properties:

String: {'Original'  '2nd order'  '1st order'}
Location: 'southeast'
Orientation: 'vertical'
FontSize: 9
Position: [0.6893 0.1564 0.1967 0.1144]
Units: 'normalized'

Use GET to show all properties

This result confirms that the second-order approximation is a good match to the original 23rd-order system.