В этом примере показано, как изменить веса на выходах, входах и переменной замедления ECR для мягких ограничений в реальном времени.
Веса, заданные в объекте MPC, переопределяются весами, предоставляемыми блоку MPC Controller. Если весовой сигнал не соединяется с блоком MPC Controller, то соответствующий вес является весом, заданным в объекте MPC.
Задайте многопараметрическую линейную систему дискретного времени без прямого сквозного соединения ввода-вывода и предположим, что вход # 4 является измеренным нарушением порядка, и выход # 4 не измеряется.
Ts = 0.1; % sampling time plant = tf({1,[1 1],5,2;3,[1 5],1,0;0,0,1,[1 1];2,[1 -1],0,0},... {[1 1 1],[1 3 4 5],[1 10],[1 5]; [1 1],[1 2],[1 2 8],[1 1]; [1 2 1],[1 3 1 1],[1 1],[1 2]; [1 1],[1 3 10 10],[1 10],[1 1]}); plant = c2d(ss(plant),Ts); plant.D = 0;
Задайте типы входного и выходного сигналов.
plant = setmpcsignals(plant,'MD',4,'UO',4); % Create the controller object with sampling period, prediction and control % horizons: p = 20; % Prediction horizon m = 3; % Control horizon mpcobj = mpc(plant,Ts,p,m);
-->Assuming unspecified input signals are manipulated variables. -->Assuming unspecified output signals are measured outputs. -->The "Weights.ManipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000. -->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000. -->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000. for output(s) y1 y2 y3 and zero weight for output(s) y4
Задайте ограничения СН.
mpcobj.MV(1).Min = -6; mpcobj.MV(1).Max = 6; mpcobj.MV(2).Min = -6; mpcobj.MV(2).Max = 6; mpcobj.MV(3).Min = -6; mpcobj.MV(3).Max = 6;
Чтобы запустить этот пример, требуется Simulink ®.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end % Define reference signal. Tstop = 10; ref = [1 0 3 1]; r = struct('time',(0:Ts:Tstop)'); N = numel(r.time); r.signals.values=ones(N,1)*ref;
Задайте измеренное нарушение порядка.
v = 0.5;
Веса OV линейно увеличиваются со временем, за исключением выхода # 2, который не взвешен.
ywt.time = r.time; ywt.signals.values = (1:N)'*[.1 0 .1 .1];
Веса MVRate уменьшаются линейно со временем.
duwt.time = r.time; duwt.signals.values = (1-(1:N)/2/N)'*[.1 .1 .1];
Вес ECR увеличивается экспоненциально со временем.
ECRwt.time = r.time; ECRwt.signals.values = 10.^(2+(1:N)'/N);
Запустите симуляцию.
mdl = 'mpc_onlinetuning'; open_system(mdl); % Open Simulink(R) Model sim(mdl); % Start Simulation
-->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. -->Assuming output disturbance added to measured output channel #3 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Задайте объект состояния реального объекта и MPC.
[A,B,C,D] = ssdata(plant); x = zeros(size(plant.B,1),1); % Initial state of the plant xmpc = mpcstate(mpcobj); % Initial state of the MPC controller
Сохраните траектории MPC с обратной связью в массивах YY, UU, XX.
YY = []; UU = []; XX = [];
Объект MPCMOVEOPT используется для обеспечения весов во время выполнения.
options = mpcmoveopt;
Запустите симуляцию.
for t = 0:N-1, % Store states XX = [XX,x]; %#ok<*AGROW> % Compute plant output (no feedthrough from MV to Y) y = C*x+D(:,4)*v; YY = [YY;y']; % Obtain reference signal ref = r.signals.values(t+1,:)'; % Update MPCMOVEOPT object with run-time weights options.MVRateWeight = duwt.signals.values(t+1,:); options.OutputWeight = ywt.signals.values(t+1,:); options.ECRWeight = ECRwt.signals.values(t+1,:); % Compute control action u = mpcmove(mpcobj,xmpc,y(1:3),ref,v,options); UU = [UU;u']; % Update plant states x = A*x + B(:,1:3)*u + B(:,4)*v; end
Графическое изображение и сравнение результатов симуляции
figure(1); clf; subplot(121) plot(0:Ts:Tstop,[YY ysim]) grid title('output') subplot(122) plot(0:Ts:Tstop,[UU usim]) grid title('input')
Результаты симуляции совпадают.
fprintf('\n\nDifference between MPC Simulink block and MPCMOVE simulations: %g',norm(UU-usim)+norm(YY-ysim));
Difference between MPC Simulink block and MPCMOVE simulations: 6.66853e-11
bdclose(mdl);