Main Content

Design ADRC for Multi-Input Multi-Output Plant

Since R2023b

This example shows how to design active disturbance rejection control (ADRC) for a multi-input multi-output (MIMO) plant.


In this example, the plant is a model of a pilot-scale distillation column [1]. This model has two inputs: the flux flow rate u1 and the steam flow rate u2. The model has two outputs: the purity of light product y1 and the purity of heavy product y2. The model also contains unknown disturbances.

Define the plant transfer function.

s = tf('s');
G = [12.8/(16.7*s+1),-18.9/(21*s+1);6.6/(10.9*s+1),-19.4/(14.4*s+1)];

The controller objective is to keep the outputs at desired values r1=0 and r2=1. To design the two ADRC controllers for the plant, you apply a dynamic decoupling control approach [1]. Each ADRC block controls the channel from input ui to output yi (i=1,2). Then, you design a model predictive controller (MPC) as a benchmark controller for the ADRC design performance.

Design ADRC Controllers

To design the decoupled ADRC controllers, approximate the two-input two-output plant model as follows.



  • fi(t) represents the total disturbance for the channel from input ui to output yi (i=1,2), including unknown dynamics, cross channel interference, and external disturbances.

  • ni represents the orders of the derivative.

  • bi represents the critical gains.

To determine the order of derivative ni and critical gain bi, perform a step input experiment on the plant model. This example provides the DecoupledPlantIO model to simulate the model with decoupled inputs and outputs.

Open the Simulink® model.

mdl_step = "DecoupledPlantIO";

To perform the experiment from input u1=1 to output y1, specify m = 1.

Simulate the model and examine the output response.

m = 1;
out = sim(mdl_step);
t1 = out.logsout{1}.Values.Time;
y1 = out.logsout{1}.Values.Data;
xlabel("time (s)")

The step response is first-order, thus the order of derivative n1=1. You can approximate the critical gain b1 using the slope. For this response, b1=0.75.

b1 = 0.75;

Similarly, specify m=2 for the experiment from input u2=1 to output y2.

m = 2;
out = sim(mdl_step);
t2 = out.logsout{1}.Values.Time;
y2 = out.logsout{1}.Values.Data;
xlabel('time (s)')

The step response is also first-order, thus n2=1 and the critical gain b2=-1.3 .

b2 = -1.3;

Tune ADRC Controllers

To tune the performance of the ADRC controllers, use the controller bandwidth wc and observer bandwidth wo parameters. In this example, the tuning goal is to match the performance of an optimal MPC controller.

Design an MPC controller for the plant model.

Ts = 1; % sample time
mpc1 = mpc(G,Ts);
-->"PredictionHorizon" is empty. Assuming default 10.
-->"ControlHorizon" is empty. Assuming default 2.
-->"Weights.ManipulatedVariables" is empty. Assuming default 0.00000.
-->"Weights.ManipulatedVariablesRate" is empty. Assuming default 0.10000.
-->"Weights.OutputVariables" is empty. Assuming default 1.00000.

You can adjust the weights of the controller to tune the performance. For more information, see Tune Weights (Model Predictive Control Toolbox).

Specify weights for the MPC controller.

mpc1.Weights.ManipulatedVariablesRate = 0.7389*[1,1];
mpc1.Weights.OutputVariables = 0.1353*[1,1];

To match the response of the MPC controller, you must set the controller bandwidth and observer bandwidth of the ADRC controllers. For this example, wc=0.25 and wo=3 match the response of the MPC controller.

wc = 0.25;
wo = 3;

Run the model for 45 seconds.

T = 45;
mdl = "ADRCWithBenchmarkMIMO";

-->Converting the "Model.Plant" property to state-space.
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output #1 is integrated white noise.
-->Assuming output disturbance added to measured output #2 is integrated white noise.
-->"Model.Noise" is empty. Assuming white noise on each measured output.

View the outputs of the plant using the scope.

open_system(mdl + "/outputs")

The MPC controller and ADRC controllers have a similar response for output y2. The ADRC controllers have a smaller tracking error for output y1 compared to the MPC controller.

Disturbance Rejection

The model has an external disturbance from 50 to 100 seconds. Run the model to 150 seconds.

T = 150;

View the outputs of the plant using the scope.

open_system(mdl + "/outputs")

For this example, the ADRC controllers have better disturbance rejection results compared to the benchmark MPC controller. The outputs more quickly converge to reference values in the presence of a disturbance sue to the ADRC controllers using control inputs with larger magnitudes. View the inputs of the plant using the scope.

open_system(mdl + "/inputs")


[1] Zheng, Qing, Zhongzhou Chen, and Zhiqiang Gao. “A Dynamic Decoupling Control Approach and Its Applications to Chemical Processes.” In 2007 American Control Conference, 5176–81, 2007.

See Also

Related Topics