В этом примере показано, как к модели проекта прогнозирующий контроллер с одним измеренным выходом, одной переменной, которой управляют, одним измеренным воздействием и одним неизмеренным воздействием в типичном рабочем процессе.
Дискретное время линейная динамическая модель разомкнутого цикла задано ниже с шагом расчета Ts
.
sys = ss(tf({1,1,1},{[1 .5 1],[1 1],[.7 .5 1]})); Ts = 0.2; model = c2d(sys,Ts);
Задайте тип входных сигналов: первый сигнал является переменной, которой управляют, второй сигнал является измеренным воздействием, третий является неизмеренным воздействием.
model = setmpcsignals(model,'MV',1,'MD',2,'UD',3);
Создайте объект контроллера с выборкой периода, предсказания и управляйте горизонтами.
mpcobj = mpc(model,Ts,10,3);
-->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.
Задайте ограничения на переменную, которой управляют.
mpcobj.MV = struct('Min',0,'Max',1,'RateMin',-10,'RateMax',10);
Для неизмеренных входных воздействий его модель является интегратором, управляемым белым шумом с отклонением = 1000.
mpcobj.Model.Disturbance = tf(sqrt(1000),[1 0]);
sim
КомандаЗадайте параметры симуляции.
Tstop = 30; % simulation time Tf = round(Tstop/Ts); % number of simulation steps r = ones(Tf,1); % reference signal v = [zeros(Tf/3,1);ones(2*Tf/3,1)]; % measured disturbance signal
Запустите симуляцию с обратной связью и постройте результаты.
sim(mpcobj,Tf,r,v)
Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Задайте воздействие и шумовые сигналы в объекте опции симуляции.
SimOptions = mpcsimopt(mpcobj); d = [zeros(2*Tf/3,1);-0.5*ones(Tf/3,1)]; SimOptions.Unmeas = d; % unmeasured input disturbance signal SimOptions.OutputNoise=.001*(rand(Tf,1)-.5); % output measurement noise SimOptions.InputNoise=.05*(rand(Tf,1)-.5); % noise on manipulated variables
Запустите симуляцию с обратной связью и сохраните результаты в рабочую область.
[y,t,u,xp] = sim(mpcobj,Tf,r,v,SimOptions);
Постройте результаты.
figure subplot(2,1,1) plot(0:Tf-1,y,0:Tf-1,r) title('Output') grid subplot(2,1,2) plot(0:Tf-1,u) title('Input') grid
Протестируйте робастность контроллера MPC против несоответствия модели. Задайте истинный объект simModel
, с номинальным выходным значением 0.1
.
simModel = ss(tf({1,1,1},{[1 .8 1],[1 2],[.6 .6 1]})); simModel = setmpcsignals(simModel,'MV',1,'MD',2,'UD',3); simModel = struct('Plant',simModel); simModel.Nominal.Y = 0.1; simModel.Nominal.X = -.1*[1 1 1 1 1];
Создайте объект опции.
SimOptions.Model = simModel; SimOptions.plantinit = [0.1 0 -0.1 0 .05]; % Initial state of the true plant SimOptions.OutputNoise = []; % remove output measurement noise SimOptions.InputNoise = []; % remove noise on manipulated variables % Run the closed-loop simulation and plot results. sim(mpcobj,Tf,r,v,SimOptions)
-->Converting model to discrete time.
Ослабьте ограничения на переменные, которыми управляют, от трудно до мягкого.
mpcobj.MV.MinECR = 1; mpcobj.MV.MaxECR = 1;
Задайте выходное ограничение.
mpcobj.OV.Max = 1.1;
Запустите новую симуляцию с обратной связью.
sim(mpcobj,Tf,r,v)
Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Ограничение мВ было немного нарушено, в то время как ограничение MO было нарушено больше. Оштрафуйте более выходное ограничение и повторно выполните симуляцию.
mpcobj.OV.MaxECR = 0.001; % The closer to zero, the harder the constraint
sim(mpcobj,Tf,r,v)
Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Теперь ограничение MO было немного нарушено, в то время как ограничение мВ было нарушено больше как ожидалось.
Программное обеспечение Model Predictive Control Toolbox™ обеспечивает Фильтр Калмана по умолчанию, чтобы оценить состояние объекта, воздействия и шумовых моделей. Можно изменить усиления Кальмана.
Во-первых, получите значение по умолчанию усиления Кальмана и матрицы пространства состояний.
[L,M,A1,Cm1] = getEstimator(mpcobj);
Полюса наблюдателя по умолчанию:
e = eig(A1-A1*M*Cm1)
e = 0.5708 + 0.4144i 0.5708 - 0.4144i 0.4967 + 0.0000i 0.9334 + 0.1831i 0.9334 - 0.1831i 0.8189 + 0.0000i
Спроектируйте новое средство оценки состояния размещением полюса.
poles = [.8 .75 .7 .85 .6 .81]; L = place(A1',Cm1',poles)'; M = A1\L; setEstimator(mpcobj,L,M);
Протестируйте поведение объекта в разомкнутом цикле с помощью sim
команда. Установите OpenLoop
отметьте к on
, и обеспечьте последовательность переменных, которыми управляют, которые волнуют систему.
SimOptions.OpenLoop = 'on';
SimOptions.MVSignal = sin((0:Tf-1)'/10);
Когда ссылочный сигнал будет проигнорирован, мы можем постараться не задавать его.
sim(mpcobj,Tf,[],v,SimOptions)
Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. -->Converting model to discrete time.
Чтобы исследовать, сможет ли контроллер MPC отклонить постоянные выходные воздействия и отследить постоянное заданное значение с нулевыми смещениями в установившемся, вычислите усиление DC от выходных воздействий до управляемых выходных параметров с помощью cloffset
команда.
DC = cloffset(mpcobj);
fprintf('DC gain from output disturbance to output = %5.8f (=%g) \n',DC,DC);
DC gain from output disturbance to output = 0.00000000 (=4.55191e-15)
Нулевое усиление означает, что выход отследит желаемое заданное значение.
mpcmove
Во-первых, получите матрицы пространства состояний дискретного времени объекта.
[A,B,C,D] = ssdata(model); Tstop = 5; % Simulation time x = [0 0 0 0 0]'; % Initial state of the plant xmpc = mpcstate(mpcobj); % Initial state of the MPC controller r = 1; % Output reference signal
Сохраните траектории MPC с обратной связью в массивах YY
, UU
, и XX
.
YY=[]; UU=[]; XX=[];
Запустите цикл симуляции
for t=0:round(Tstop/Ts)-1 % Store states XX = [XX,x]; %#ok<*AGROW> % Define measured disturbance signal v = 0; if t*Ts>=10 v = 1; end % Define unmeasured disturbance signal d = 0; if t*Ts>=20 d = -0.5; end % Plant equations: output update (no feedthrough from MV to Y) y = C*x + D(:,2)*v + D(:,3)*d; YY = [YY,y]; % Compute MPC action u = mpcmove(mpcobj,xmpc,y,r,v); % Plant equations: state update x = A*x + B(:,1)*u + B(:,2)*v + B(:,3)*d; UU = [UU,u]; end
Постройте график результатов.
figure subplot(2,1,1) plot(0:Ts:Tstop-Ts,YY) grid title('Output') subplot(2,1,2) plot(0:Ts:Tstop-Ts,UU) grid title('Input')
Если когда-либо во время симуляции вы хотите проверять оптимальные предсказанные траектории, она может быть возвращена mpcmove
также. Примите, что вы хотите начать с текущего состояния и иметь изменение заданного значения в 0,5 и принять, что измеренного воздействия не стало.
r = 0.5; v = 0; [~,Info] = mpcmove(mpcobj,xmpc,y,r,v);
Извлеките оптимальные предсказанные траектории.
topt = Info.Topt; yopt = Info.Yopt; uopt = Info.Uopt; figure subplot(2,1,1) stairs(topt,yopt) title('Optimal sequence of predicted outputs') grid subplot(2,1,2) stairs(topt,uopt) title('Optimal sequence of manipulated variables') grid
Когда ограничения не активны, контроллер MPC ведет себя как линейный контроллер. Можно получить форму пространства состояний контроллера MPC.
LTI = ss(mpcobj,'rv');
Получите матрицы пространства состояний для линеаризовавшего контроллера.
[AL,BL,CL,DL] = ssdata(LTI);
Симулируйте линейный MPC система с обратной связью и сравните линеаризовавший контроллер MPC с исходным контроллером MPC с выключенными ограничениями.
mpcobj.MV = []; % No input constraints mpcobj.OV = []; % No output constraints Tstop = 5; %Simulation time xL = zeros(size(BL,1),1); % Initial state of linearized MPC controller x = [0 0 0 0 0]'; % Initial state of plant y = 0; % Initial measured output r = 1; % Output reference set-point u = 0; % Previous input command YY = []; XX = []; xmpc = mpcstate(mpcobj); for t = 0:round(Tstop/Ts)-1 YY = [YY,y]; XX = [XX,x]; v = 0; if t*Ts>=10 v = 1; end d = 0; if t*Ts>=20 d = -0.5; end uold = u; % Compute the linear MPC control action u = CL*xL+DL*[y;r;v]; % Compare the input move with the one provided by MPCMOVE uMPC = mpcmove(mpcobj,xmpc,y,r,v); dispStr(t+1) = {sprintf('t=%5.2f, u=%7.4f (provided by LTI), u=%7.4f (provided by MPCOBJ)',t*Ts,u,uMPC)}; %#ok<*SAGROW> % Update plant equations x = A*x + B(:,1)*u + B(:,2)*v + B(:,3)*d; % Update controller equations xL = AL*xL + BL*[y;r;v]; % Update output equations y = C*x + D(:,1)*u + D(:,2)*v + D(:,3)*d; end
Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Отобразите результаты.
for t=0:round(Tstop/Ts)-1 disp(dispStr{t+1}); end
t= 0.00, u= 5.2478 (provided by LTI), u= 5.2478 (provided by MPCOBJ) t= 0.20, u= 3.0134 (provided by LTI), u= 3.0134 (provided by MPCOBJ) t= 0.40, u= 0.2281 (provided by LTI), u= 0.2281 (provided by MPCOBJ) t= 0.60, u=-0.9952 (provided by LTI), u=-0.9952 (provided by MPCOBJ) t= 0.80, u=-0.8749 (provided by LTI), u=-0.8749 (provided by MPCOBJ) t= 1.00, u=-0.2022 (provided by LTI), u=-0.2022 (provided by MPCOBJ) t= 1.20, u= 0.4459 (provided by LTI), u= 0.4459 (provided by MPCOBJ) t= 1.40, u= 0.8489 (provided by LTI), u= 0.8489 (provided by MPCOBJ) t= 1.60, u= 1.0192 (provided by LTI), u= 1.0192 (provided by MPCOBJ) t= 1.80, u= 1.0511 (provided by LTI), u= 1.0511 (provided by MPCOBJ) t= 2.00, u= 1.0304 (provided by LTI), u= 1.0304 (provided by MPCOBJ) t= 2.20, u= 1.0053 (provided by LTI), u= 1.0053 (provided by MPCOBJ) t= 2.40, u= 0.9920 (provided by LTI), u= 0.9920 (provided by MPCOBJ) t= 2.60, u= 0.9896 (provided by LTI), u= 0.9896 (provided by MPCOBJ) t= 2.80, u= 0.9925 (provided by LTI), u= 0.9925 (provided by MPCOBJ) t= 3.00, u= 0.9964 (provided by LTI), u= 0.9964 (provided by MPCOBJ) t= 3.20, u= 0.9990 (provided by LTI), u= 0.9990 (provided by MPCOBJ) t= 3.40, u= 1.0002 (provided by LTI), u= 1.0002 (provided by MPCOBJ) t= 3.60, u= 1.0004 (provided by LTI), u= 1.0004 (provided by MPCOBJ) t= 3.80, u= 1.0003 (provided by LTI), u= 1.0003 (provided by MPCOBJ) t= 4.00, u= 1.0001 (provided by LTI), u= 1.0001 (provided by MPCOBJ) t= 4.20, u= 1.0000 (provided by LTI), u= 1.0000 (provided by MPCOBJ) t= 4.40, u= 0.9999 (provided by LTI), u= 0.9999 (provided by MPCOBJ) t= 4.60, u= 1.0000 (provided by LTI), u= 1.0000 (provided by MPCOBJ) t= 4.80, u= 1.0000 (provided by LTI), u= 1.0000 (provided by MPCOBJ)
Постройте график результатов.
figure plot(0:Ts:Tstop-Ts,YY) grid
Выполнение с обратной связью, где все ограничения выключены, является легким использованием sim
. Мы только задаем опцию в SimOptions
структура:
SimOptions = mpcsimopt(mpcobj); SimOptions.Constr = 'off'; % Remove all MPC constraints SimOptions.Unmeas = d; % unmeasured input disturbance sim(mpcobj,Tf,r,v,SimOptions);
Чтобы запустить этот пример, Simulink® требуется.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this part of the example.') return end
Воссоздайте контроллер MPC.
mpcobj = mpc(model,Ts,10,3); mpcobj.MV = struct('Min',0,'Max',1,'RateMin',-10,'RateMax',10); mpcobj.Model.Disturbance = tf(sqrt(1000),[1 0]);
-->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.
Объект непрерывного времени, которым будут управлять, имеет следующую реализацию пространства состояний:
[A,B,C,D] = ssdata(sys);
Симулируйте MPC с обратной связью в Simulink.
mdl1 = 'mpc_miso';
open_system(mdl1)
sim(mdl1)
Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Затем запустите симуляцию с синусоидальным выходным шумом. Примите, что выходные измерения затронуты синусоидальным шумом измерения частоты 0,1 Гц. Вы хотите сообщить объекту MPC об этом так, чтобы оценки состояния могли быть улучшены.
omega = 2*pi/10; mpcobj.Model.Noise = 0.5*tf(omega^2,[1 0 omega^2]);
Пересмотрите проект MPC и задайте белый Гауссов шум неизмеренное воздействие с нулевым средним значением и отклонением 0.1
.
mpcobj.Model.Disturbance = tf(0.1); mpcobj.weights = struct('MV',0,'MVRate',0.1,'OV',0.005); mpcobj.predictionhorizon = 40; mpcobj.controlhorizon = 3;
Запустите симуляцию.
Tstop = 150;
mdl2 = 'mpc_misonoise';
open_system(mdl2)
sim(mdl2,Tstop)
-->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->A feedthrough channel in NoiseModel was inserted to prevent problems with estimator design.
bdclose(mdl1) bdclose(mdl2)
MPC Controller | MPC Designer | mpc