www.gusucode.com > mpc 案例源码 matlab代码程序 > mpc/DesignControllerAtTheCommandLineExample.m

    %% Design MPC Controller at the Command Line
% This example shows how create and test a model predictive controller from 
% the command line.
%% Define Plant Model
% This example uses the plant model described in <docid:mpc_gs.f10-34263>. 
% Create a state space model of the plant and set some of the optional model properties.

% Copyright 2015 The MathWorks, Inc.


A = [-0.0285 -0.0014; -0.0371 -0.1476];
B = [-0.0850 0.0238; 0.0802 0.4462];
C = [0 1; 1 0];
D = zeros(2,2);
CSTR = ss(A,B,C,D);

CSTR.InputName = {'T_c','C_A_i'};
CSTR.OutputName = {'T','C_A'};
CSTR.StateName = {'C_A','T'};
CSTR.InputGroup.MV = 1;
CSTR.InputGroup.UD = 2;
CSTR.OutputGroup.MO = 1;
CSTR.OutputGroup.UO = 2;
%% Create Controller
% To improve the clarity of the example, suppress Command Window messages from 
% the MPC controller.

old_status = mpcverbosity('off');
%% 
% Create a model predictive controller with a control interval, or sample 
% time, of |1| second, and with all other properties at their default values.

Ts = 1;
MPCobj = mpc(CSTR,Ts);
%% 
% Display the controller properties in the Command Window.

display(MPCobj)
%% View and Modify Controller Properties
% Display a list of the controller properties and their current values.

get(MPCobj)
%% 
% The displayed |History| value will be different for your controller, since it depends 
% on when the controller was created. For a description of the editable properties 
% of an MPC controller, enter |mpcprops| at the command line.
% 
% Use dot notation to modify these properties. For example, change the prediction 
% horizon to |15|.

MPCobj.PredictionHorizon = 15;
%% 
% You can abbreviate property names provided that the abbreviation is unambiguous.
% 
% Many of the controller properties are structures containing additional 
% fields. Use dot notation to view and modify these field values. For example, 
% you can set the measurement units for the controller output variables. The |OutputUnit| 
% property is for display purposes only and is optional.

MPCobj.Model.Plant.OutputUnit = {'Deg C','kmol/m^3'};
%% 
% By default, the controller has no constraints on manipulated variables 
% and output variables. You can view and modify these constraints using dot notation. 
% For example, set constraints for the controller manipulated variable. 

MPCobj.MV.Min = -10;
MPCobj.MV.Max = 10;
MPCobj.MV.RateMin = -3;
MPCobj.MV.RateMax = 3;
%% 
% You can also view and modify the controller tuning weights. For example, 
% modify the weights for the manipulated variable rate and the output variables.

MPCobj.W.ManipulatedVariablesRate = 0.3;
MPCobj.W.OutputVariables = [1 0];
%% 
% You can also define time-varying constraints and weights over the prediction 
% horizon, which shifts at each time step. Time-varying constraints have a nonlinear 
% effect when they are active. For example, to force the manipulated variable 
% to change more slowly towards the end of the prediction horizon, enter:
% 
% |MPCobj.MV.RateMin = [-4; -3.5; -3; -2.5];|
% 
% |MPCobj.MV.RateMax = [4; 3.5; 3; 2.5];|
% 
% The |-2.5| and |2.5| values are used for the fourth step and beyond.
% 
% Similarly, you can specify different output variable weights for each step 
% of the prediction horizon. For example, enter:
% 
% |MPCobj.W.OutputVariables = [0.1 0; 0.2 0; 0.5 0; 1 0];|
% 
% You can also modify the disturbance rejection characteristics of the controller. 
% See <docid:mpc_ref.buik9hk-1 docid:mpc_ref.buik9hk-1>, <docid:mpc_ref.buyfxwq 
% docid:mpc_ref.buyfxwq> and  <docid:mpc_ref.busvcq4 docid:mpc_ref.busvcq4> for 
% more information.
%% Review Controller Design
% Generate a report on potential run-time stability and performance issues.

review(MPCobj)
%% 
% <<../mpcreview.png>>
% 
% In this example, the <docid:mpc_ref.bs4cqqk-1 docid:mpc_ref.bs4cqqk-1> 
% command found two potential issues with the design. The first warning asks whether 
% the user intends to have a weight of zero on the |C_A| output. The second warning 
% advises the user to avoid having hard constraints on both |MV| and |MVRate|.
%% Perform Linear Simulations
% Use the <docid:mpc_ref.f2-83895 docid:mpc_ref.f2-83895> function to run a 
% linear simulation of the system. For example, simulate the closed-loop response 
% of |MPCobj| for |26| control intervals. Specify setpoints of |2| and |0| for 
% the reactor temperature and the residual concentration respectively. The setpoint 
% for the residual concentration is ignored because the tuning weight for the 
% second output is zero. 

T = 26;
r = [0 0; 2 0];
sim(MPCobj,T,r)
%% 
% You can modify the simulation options using <docid:mpc_ref.f2-66613 docid:mpc_ref.f2-66613>. 
% For example, run a simulation with the manipulated variable constraints turned 
% off.

MPCopts = mpcsimopt;
MPCopts.Constraints = 'off';
sim(MPCobj,T,r,MPCopts)
%% 
% The first move of the manipulated variable now exceeds the specified |3|-unit 
% rate constraint.
% 
% You can also perform a simulation with a plant/model mismatch. For example, 
% define a plant with 50% larger gains than those in the model used by the controller.

Plant = 1.5*CSTR;
MPCopts.Model = Plant;
sim(MPCobj,T,r,MPCopts)
%% 
% The plant/model mismatch degrades controller performance slightly. Degradation 
% can be severe and must be tested on a case-by-case basis.
% 
% Other options include the addition of a specified noise sequence to the 
% manipulated variables or measured outputs, open-loop simulations, and a look-ahead 
% option for better setpoint tracking or measured disturbance rejection. 
%% Store Simulation Results
% Store the simulation results in the MATLAB Workspace.

[y,t,u] = sim(MPCobj,T,r);
%% 
% Thie syntax suppresses automatic plotting and returns the simulation results. 
% You can use the results for other tasks, including custom plotting. For example, 
% plot the manipulated variable and both output variables in the same figure.

figure
subplot(2,1,1)
plot(t,u)
title('Inputs')
legend('T_c')
subplot(2,1,2)
plot(t,y)
title('Outputs')
legend('T','C_A')
xlabel('Time')
%% 
% Restore the |mpcverbosity| setting.

mpcverbosity(old_status);