www.gusucode.com > mpc_featured 案例源码 matlab代码程序 > mpc_featured/mpcswitching.m
%% Gain Scheduled Implicit and Explicit MPC Control of Mass-Spring System % This example shows how to use an Multiple MPC Controllers block and an % Multiple Explicit MPC Controllers block to implement gain scheduled MPC % control of a nonlinear plant. % Copyright 1990-2014 The MathWorks, Inc. %% System Description % The system is composed by two masses M1 and M2 connected to two springs % k1 and k2 respectively. The collision is assumed completely inelastic. % Mass M1 is pulled by a force F, which is the manipulated variable. The % objective is to make mass M1's position y1 track a given reference r. % % The dynamics are twofold: when the masses are detached, M1 moves freely. % Otherwise, M1+M2 move together. We assume that only M1 position and a % contact sensor are available for feedback. The latter is used to trigger % switching the MPC controllers. Note that position and velocity of mass M2 % are not controllable. % % % /-----\ k1 || % F <--- | M1 |----/\/\/\-------------[|| wall % || | |---/ || % || k2 \-/ /----\ || % wall||]--/\/\/\-------------------| M2 | || % || \----/ || % || || % ----yeq2------------------ y1 ------ y2 ----------------yeq1----> y axis % % % The model is a simplified version of the model proposed in the following % reference: % % A. Bemporad, S. Di Cairano, I. V. Kolmanovsky, and D. Hrovat, "Hybrid % modeling and control of a multibody magnetic actuator for automotive % applications," in Proc. 46th IEEE(R) Conf. on Decision and Control, New % Orleans, LA, 2007. %% Model Parameters M1 = 1; % mass M2 = 5; % mass k1 = 1; % spring constant k2 = 0.1; % spring constant b1 = 0.3; % friction coefficient b2 = 0.8; % friction coefficient yeq1 = 10; % wall mount position yeq2 = -10; % wall mount position %% State Space Models % states: position and velocity of mass M1; % manipulated variable: pull force F % measured disturbance: a constant value of 1 which provides calibrates spring force to the right value % measured output: position of mass M1 % % State-space model of M1 when masses are not in contact. A1 = [0 1;-k1/M1 -b1/M1]; B1 = [0 0;-1/M1 k1*yeq1/M1]; C1 = [1 0]; D1 = [0 0]; sys1 = ss(A1,B1,C1,D1); sys1 = setmpcsignals(sys1,'MD',2); %% % State-space model when the two masses are in contact. A2 = [0 1;-(k1+k2)/(M1+M2) -(b1+b2)/(M1+M2)]; B2 = [0 0;-1/(M1+M2) (k1*yeq1+k2*yeq2)/(M1+M2)]; C2 = [1 0]; D2 = [0 0]; sys2 = ss(A2,B2,C2,D2); sys2 = setmpcsignals(sys2,'MD',2); %% Design MPC Controllers % Common parameters Ts = 0.2; % sampling time p = 20; % prediction horizon m = 1; % control horizon %% % Design first MPC controller for the case when mass M1 detaches from M2. MPC1 = mpc(sys1,Ts,p,m); MPC1.Weights.OV = 1; %% % Specify constraints on the manipulated variable. MPC1.MV = struct('Min',0,'Max',30,'RateMin',-10,'RateMax',10); %% % Design second MPC controller for the case when mass M1 and M2 are together. MPC2 = mpc(sys2,Ts,p,m); MPC2.Weights.OV = 1; %% % Specify constraints on the manipulated variable. MPC2.MV = struct('Min',0,'Max',30,'RateMin',-10,'RateMax',10); %% Simulate Gain Scheduled MPC in Simulink(R) % To run this example, Simulink(R) is required. if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end %% % Simulate gain scheduled MPC control with Multiple MPC Controllers block. y1initial = 0; % Initial position of M1 y2initial = 10; % Initial position of M2 mdl = 'mpc_switching'; open_system(mdl); if exist('animationmpc_switchoff','var') && animationmpc_switchoff close_system([mdl '/Animation']); clear animationmpc_switchoff end %% disp('Start simulation by switching control between MPC1 and MPC2 ...'); disp('Control performance is satisfactory.'); open_system([mdl '/signals']); sim(mdl); MPC1saved = MPC1; MPC2saved = MPC2; %% % Use of two controllers provides good performance under all conditions. %% Repeat Simulation Using MPC1 Only (Assumes Masses Never in Contact) disp('Now repeat simulation by using only MPC1 ...'); disp('When two masses stick together, control performance deteriorates.'); MPC1 = MPC1saved; MPC2 = MPC1saved; sim(mdl); %% % In this case, performance degrades whenever the two masses join. %% Repeat Simulation Using MPC2 Only (Assumes Masses Always in Contact) disp('Now repeat simulation by using only MPC2 ...'); disp('When two masses are detached, control performance deteriorates.'); MPC1 = MPC2saved; MPC2 = MPC2saved; sim(mdl); %% % In this case, performance degrades when the masses separate, causing % the controller to apply excessive force. bdclose(mdl); close(findobj('Tag','mpc_switching_demo')); %% Design Explicit MPC Controllers % To reduce online computational effort, you can create an explicit MPC % controller for each operating condition, and implement gain-scheduled % explicit MPC control using the Multiple Explicit MPC Controllers block. %% % To create an explicit MPC controller, first define the operating ranges % for the controller states, input signals, and reference signals. Create % an explicit MPC range object using the corresponding traditional % controller, MPC1. range = generateExplicitRange(MPC1saved); %% % Specify the ranges for the controller states. Both MPC1 and MPC2 contain % states for: % * The position and velocity of mass M1 % * An integrator from the default output disturbance model range.State.Min(:) = [-10;-8;-3]; range.State.Max(:) = [10;8;3]; %% % When possible, use your knowledge of the plant to define the state % ranges. However, it can be difficult when the state does not correspond % to a physical parameter, such as for the output disturbance model state. % In that case, collect range information using simulations with typical % reference and disturbance signals. For this system, you can activate the % optional est.state outport of the Multiple MPC Controllers block, and % view the estimated states using a scope. When simulating the controller % responses, use a reference signal that covers the expected operating % range. %% % Define the range for the reference signal. Select a reference range that % is smaller than the M1 position range. range.Reference.Min = -8; range.Reference.Max = 8; %% % Specify the manipulated variable range using the defined MV constraints. range.ManipulatedVariable.Min = 0; range.ManipulatedVariable.Max = 30; %% % Define the range for the measured disturbance signal. Since the measured % disturbance is constant, specify a small range around the constant value, % 1. range.MeasuredDisturbance.Min = 0.9; range.MeasuredDisturbance.Max = 1.1; %% % Create an explicit MPC controller that corresponds to MPC1 using the % specified range object. expMPC1 = generateExplicitMPC(MPC1saved,range); %% % Create an explicit MPC controller that corresponds to MPC2. Since MPC1 % and MPC2 operate over the same state and input ranges, and have the same % constraints, you can use the same range object. expMPC2 = generateExplicitMPC(MPC2saved,range); %% % In general, the explicit MPC ranges of different controllers may not % match. For example, the controllers may have different constraints or % state ranges. In such cases, create a separate explicit MPC range object % for each controller. %% Validate Explicit MPC Controllers % It is good practice to validate the performance of each explicit MPC % controller before implementing gain-scheduled explicit MPC. For example, % to compare the performance of MPC1 and expMPC1, simulate the closed-loop % response of each controller using sim. r = [zeros(30,1); 5*ones(160,1); -5*ones(160,1)]; [Yimp,Timp,Uimp] = sim(MPC1saved,350,r,1); [Yexp,Texp,Uexp] = sim(expMPC1,350,r,1); %% % Compare the plant output and manipulated variable sequences for the two % controllers. figure subplot(2,1,1) plot(Timp,Yimp,'b-',Texp,Yexp,'r--') grid on xlabel('Time (s)') ylabel('Output') title('Explicit MPC Validation') legend('Implicit MPC','Explicit MPC') subplot(2,1,2) plot(Timp,Uimp,'b-',Texp,Uexp,'r--') grid on ylabel('MV') xlabel('Time (s)') %% % The closed-loop responses and manipulated variable sequences of the % implicit and explicit controllers match. Similarly, you can validate the % performance of expMPC2 against that of MPC2. %% % If the responses of the implicit and explicit controllers do not match, % adjust the explicit MPC ranges, and create a new explicit MPC controller. %% Simulate Gain-Scheduled Explicit MPC % To implement gain-scheduled explicit MPC control, replace the Multiple % MPC Controllers block with the Multiple Explicit MPC Controllers block. expModel = 'mpc_switching_explicit'; open_system(expModel); %% % Run the simulation. sim(expModel); %% % To view the simulation results, open the signals scope. open_system([expModel '/signals']); %% % The gain-scheduled explicit MPC controllers provide the same performance % as the gain-scheduled implicit MPC controllers. %% bdclose(expModel); close(findobj('Tag','mpc_switching_demo'));