Show minor edits - Show changes to markup
To create an MPC controller in MPT3, use the MPCController constructor:
mpc = MPCController(sys)
where sys represents the prediction model, created by LTISystem, PWASystem or MLDSystem constructors (see here).
As an example, let use consider an LTI prediction model, represented by the state-update equation x^+ = A x + B u with A = [1 1; 0 1] and B = [1; 0.5]:
model = LTISystem('A', [1 1; 0 1], 'B', [1; 0.5]);
Next we specify more properties of the model:
 [-5; -5] <= x <= [5; 5]:
model.x.min = [-5; -5]; model.x.max = [5; 5];
-1 <= u <= 1:
model.u.min = -1; model.u.max = 1;
x_k^T Q x_k with Q = [1 0; 0 1]:
Q = [1 0; 0 1]; model.x.penalty = QuadFunction(Q);
u_k^T R u_k with R=1:
R = 1; model.u.penalty = OneFunction(R);
A number of other constraints and penalties can be added using the concept of filters.
Finally, we can synthesize an MPC controller with prediction horizon say N=5:
N = 5; mpc = MPCController(model, N)
Now the mpc object is ready to be used as an MPC controller. For instance, we can ask it for the optimal control input for a given value of the initial state:
x0 = [4; 0];
u = mpc.evaluate(x0)
u =
    -1
You can also retrieve the full open-loop predictions:
(:source lang=MATLAB -getcode:)
[u, feasible, openloop] = mpc.evaluate(x0)
openloop = 
    cost: 32.4898
       U: [-1 -1 0.1393 0.3361 -5.2042e-16]
       X: [2x6 double]
       Y: [0x5 double]
Please consult this page to learn how to perform closed-loop simulations in MPT3.
Once you are satisfied with the controller's performance, you can convert it to an explicit form by calling the toExplicit() method:
expmpc = mpc.toExplicit();
This will generate an instance of the EMPCController class, which represents all explicit MPC controllers in MPT3. Explicit controllers can be used for evaluation/simulation in exactly the same way, i.e.,
[u, feasible, openloop] = expmpc.evaluate(x0)
openloop = 
    cost: 32.4898
       U: [-1 -1 0.1393 0.3361 -5.2042e-16]
       X: [2x6 double]
       Y: [0x5 double]
h1. Adding terminal set and terminal penalty
Consider an oscillator model defined in 2D.
(:source lang=MATLAB -getcode:)A = [ 0.5403, -0.8415; 0.8415, 0.5403]; B = [ -0.4597; 0.8415]; C = [1 0]; D = 0;
Linear discrete-time model with sample time 1
(:source lang=MATLAB -getcode:)sys = ss(A,B,C,D,1); model = LTISystem(sys);
Set constraints on output
(:source lang=MATLAB -getcode:)model.y.min = -10; model.y.max = 10;
Set constraints on input
(:source lang=MATLAB -getcode:)model.u.min = -1; model.u.max = 1;
Include weights on states/inputs
(:source lang=MATLAB -getcode:)model.x.penalty = QuadFunction(eye(2)); model.u.penalty = QuadFunction(1);
Compute terminal set
(:source lang=MATLAB -getcode:)Tset = model.LQRSet;
Compute terminal weight
(:source lang=MATLAB -getcode:)PN = model.LQRPenalty;
Add terminal set and terminal penalty
(:source lang=MATLAB -getcode:)
model.x.with('terminalSet');
model.x.terminalSet = Tset;
model.x.with('terminalPenalty');
model.x.terminalPenalty = PN;
Formulate finite horizon MPC problem
(:source lang=MATLAB -getcode:)ctrl = MPCController(model,5);
model.x.penalty = Penalty(eye(2),2); model.u.penalty = Penalty(1,2);
model.x.penalty = QuadFunction(eye(2)); model.u.penalty = QuadFunction(1);
model.x.penalty = Penalty([1 0; 0 1], 2); % 2 = quadratic penalty
Q = [1 0; 0 1]; model.x.penalty = QuadFunction(Q);
u_k^T Q u_k with Q = 1:
u_k^T R u_k with R=1:
model.u.penalty = Penalty(1, 2);
R = 1; model.u.penalty = OneFunction(R);
Synthesis of MPC controllers in MPT3 is based on two principles:
To create an MPC controller in MPT3, use the MPCController constructor:
mpc = MPCController(sys)
where sys represents the prediction model, created by LTISystem, PWASystem or MLDSystem constructors (see here).
As an example, let use consider an LTI prediction model, represented by the state-update equation x^+ = A x + B u with A = [1 1; 0 1] and B = [1; 0.5]:
model = LTISystem('A', [1 1; 0 1], 'B', [1; 0.5]);
Next we specify more properties of the model:
 [-5; -5] <= x <= [5; 5]:
model.x.min = [-5; -5]; model.x.max = [5; 5];
-1 <= u <= 1:
model.u.min = -1; model.u.max = 1;
x_k^T Q x_k with Q = [1 0; 0 1]:
model.x.penalty = Penalty([1 0; 0 1], 2); % 2 = quadratic penalty
u_k^T Q u_k with Q = 1:
model.u.penalty = Penalty(1, 2);
A number of other constraints and penalties can be added using the concept of filters.
Finally, we can synthesize an MPC controller with prediction horizon say N=5:
N = 5; mpc = MPCController(model, N)
Now the mpc object is ready to be used as an MPC controller. For instance, we can ask it for the optimal control input for a given value of the initial state:
x0 = [4; 0];
u = mpc.evaluate(x0)
u =
    -1
You can also retrieve the full open-loop predictions:
(:source lang=MATLAB -getcode:)
[u, feasible, openloop] = mpc.evaluate(x0)
openloop = 
    cost: 32.4898
       U: [-1 -1 0.1393 0.3361 -5.2042e-16]
       X: [2x6 double]
       Y: [0x5 double]
Please consult this page to learn how to perform closed-loop simulations in MPT3.
Once you are satisfied with the controller's performance, you can convert it to an explicit form by calling the toExplicit() method:
expmpc = mpc.toExplicit();
This will generate an instance of the EMPCController class, which represents all explicit MPC controllers in MPT3. Explicit controllers can be used for evaluation/simulation in exactly the same way, i.e.,
[u, feasible, openloop] = expmpc.evaluate(x0)
openloop = 
    cost: 32.4898
       U: [-1 -1 0.1393 0.3361 -5.2042e-16]
       X: [2x6 double]
       Y: [0x5 double]
h1. Adding terminal set and terminal penalty
Consider an oscillator model defined in 2D.
(:source lang=MATLAB -getcode:)A = [ 0.5403, -0.8415; 0.8415, 0.5403]; B = [ -0.4597; 0.8415]; C = [1 0]; D = 0;
Linear discrete-time model with sample time 1
(:source lang=MATLAB -getcode:)sys = ss(A,B,C,D,1); model = LTISystem(sys);
Set constraints on output
(:source lang=MATLAB -getcode:)model.y.min = -10; model.y.max = 10;
Set constraints on input
(:source lang=MATLAB -getcode:)model.u.min = -1; model.u.max = 1;
Include weights on states/inputs
(:source lang=MATLAB -getcode:)model.x.penalty = Penalty(eye(2),2); model.u.penalty = Penalty(1,2);
Compute terminal set
(:source lang=MATLAB -getcode:)Tset = model.LQRSet;
Compute terminal weight
(:source lang=MATLAB -getcode:)PN = model.LQRPenalty;
Add terminal set and terminal penalty
(:source lang=MATLAB -getcode:)
model.x.with('terminalSet');
model.x.terminalSet = Tset;
model.x.with('terminalPenalty');
model.x.terminalPenalty = PN;
Formulate finite horizon MPC problem
(:source lang=MATLAB -getcode:)ctrl = MPCController(model,5);