www.gusucode.com > mpc_featured 案例源码 matlab代码程序 > mpc_featured/mpcsensitivity.m

    %% Adjusting Input and Output Weights Based on Sensitivity Analysis
% This example shows how to compute numerical derivatives of a closed-loop
% cumulated performance index with respect to weights and use them to
% improve model predictive controller performance.

% Copyright 1990-2014 The MathWorks, Inc.

%% Define Plant Model
plant = ss(tf({1,1,2;1 -1 -1},{[1 0 0],[1 0 0],[1 1];[1 2 8],[1 3],[1 1 3]}),'min');

%% Design MPC Controller
% Create an MPC controller with initial design parameters.
Ts = 0.1;           % Sampling time
p = 20;             % Prediction horizon
m = 3;              % Control horizon
mpcobj = mpc(plant,Ts,p,m);
%%
% Set constraints on manipulated variables and their rates of change.
for i = 1:3,
    mpcobj.MV(i).Min = -2;
    mpcobj.MV(i).Max = 2;
    mpcobj.MV(i).RateMin = -4;
    mpcobj.MV(i).RateMax = 4;
end
%%
% Set weights on output variables.
mpcobj.Weights.OutputVariables = [1 1];
%%
% Set weights on the rates of manipulated variables.
mpcobj.Weights.ManipulatedVariablesRate = [.1 .1 .1];
%%
% Weights on manipulated variables remain as the default values [0 0 0].

%% Performance Evaluation Setup
% The default closed-loop performance is expressed through a set of weights
% that reflect the desired closed-loop behavior.  The weights are contained
% in a structure with the same fields as the Weights property of an MPC
% object.
PerformanceWeights = mpcobj.weights; 

%% 
% In this example we make output weights more important than weights on MV
% rates in evaluating closed-loop performance.
PerformanceWeights.OutputVariables = [100 100]; 
PerformanceWeights.ManipulatedVariablesRate = [1 1 1]; 
%%
% Note that "PerformanceWeights" is only used in the cumulated performance
% index computation.  It is not related to the weights specified inside the
% MPC object.  

%% Setup Simulation Options
% In this example, we only inspect the setpoint tracking scenario for the
% sensitivity analysis.
Tstop = 80;             % time steps to simulate
r = ones(Tstop,1)*[1 1];% set point signals
v = [];                 % no measured disturbance
simopt = mpcsimopt;
simopt.PlantInitialState = zeros(8,1);

%% Compute Sensitivities
[J1, Sens1] = sensitivity(mpcobj, 'ISE', PerformanceWeights, Tstop, r, v, simopt);
disp('')
disp('--------------')
disp('Sensitivity analysis')
disp('--------------')
disp('')
fprintf('Output weights:     dJ/dWy  = [%g, %g]\n',Sens1.OutputVariables);
fprintf('Input weights:      dJ/dWu  = [%g, %g, %g]\n',Sens1.ManipulatedVariables);
fprintf('Input-rate weights: dJ/dWdu = [%g, %g, %g]\n',Sens1.ManipulatedVariablesRate);
disp('--------------')
disp('')

%% Adjust MPC Weights
% Since we always want to reduce closed-loop cumulated performance index
% J, in this example the derivatives with respect to output weights show
% that the weight on y1 should be increased, as the corresponding
% derivative is negative, while the weight on y2 should be decreased.   
mpcobj_new = mpcobj;

%% 
% Sensitivity less than 0 suggests increasing output weight from 1 to 2.
mpcobj_new.Weights.OutputVariables(1) = 2;   
%%
% Sensitivity greater than 0 suggests decreasing output weight from 1 to 0.2.
mpcobj_new.Weights.OutputVariables(2) = 0.2; 
%%
% Note that the sensitivity analysis only tells you which direction to
% change the parameters, not how much.  Trial and error is expected.

%% Verify Performance Changes
[y1, t1] = sim(mpcobj, Tstop, r, v, simopt);
[y2, t2] = sim(mpcobj_new, Tstop, r, v, simopt);
h = figure;
subplot(211)
plot(t2,r(:,1),t1,y1(:,1),t2,y2(:,1));grid
legend('reference','original tuning','new tuning')
title('Output #1')
subplot(212)
plot(t2,r(:,2),t1,y1(:,2),t2,y2(:,2));grid
legend('reference','original tuning','new tuning')
title('Output #2')

%% Verify Cumulated Performance Index is Reduced
% Recompute just the cumulated performance index using the same performance
% measure. 
J2 = sensitivity(mpcobj_new, 'ISE', PerformanceWeights, Tstop, r, v, simopt);
fprintf('Previous Cumulated Performance Index J1 = %g\n',J1);
fprintf('New Cumulated Performance Index J2 = %g\n',J2);
%%
% Note that the absolute value of the cumulated performance index is not
% important.

%% Use a User-Defined Performance Function
% This is an example of how to write a user-defined performance function
% used by the |sensitivity| method.  In this example, custom function 
% |mpc_performance_function.m| illustrates how ISE performance index is
% implemented.
%
J3 = sensitivity(mpcobj,'mpc_performance_function',Tstop,r,PerformanceWeights);
fprintf('User Defined Cumulated Performance Index J3 = %g (same as J1).\n',J3);

%%