Модель проекта прогнозирующий контроллер в рабочей точке равновесия

В этом примере показано, как спроектировать прогнозирующий контроллер модели с ненулевой номинальной стоимостью.

Модель объекта управления получена линеаризацией нелинейного объекта в Simulink® в ненулевой установившейся рабочей точке.

Линеаризуйте нелинейную модель объекта управления

Чтобы запустить этот пример, Simulink и Simulink Control Design™ требуются.

if ~mpcchecktoolboxinstalled('simulink')
    disp('Simulink is required to run this example.')
    return
end
if ~mpcchecktoolboxinstalled('slcontrol')
    disp('Simulink Control Design is required to run this example.')
    return
end

Нелинейный объект реализован в модели Simulink mpc_nloffsets и линеаризовавший в условиях работы по умолчанию с помощью linearize функция от Simulink Control Design.

Создайте спецификацию рабочей точки для условия начальной буквы текущей модели.

plant_mdl = 'mpc_nloffsets';
op = operspec(plant_mdl);

Вычислите рабочую точку для этого начального условия.

[op_point, op_report] = findop(plant_mdl,op);
 Operating point search report:
---------------------------------

opreport = 


 Operating point search report for the Model mpc_nloffsets.
 (Time-Varying Components Evaluated at time t=0)

Operating point specifications were successfully met.
States: 
----------
    <strong>Min</strong>        <strong>x</strong>       <strong>Max</strong>    <strong>dxMin</strong>        <strong>dx</strong>         <strong>dxMax</strong>
    <strong>____</strong>    <strong>_______</strong>    <strong>___</strong>    <strong>_____</strong>    <strong>___________</strong>    <strong>_____</strong>

(1.) mpc_nloffsets/Integrator
    -Inf    0.57514    Inf      0      -1.8208e-14      0  
(2.) mpc_nloffsets/Integrator2
    -Inf     2.1503    Inf      0      -8.3846e-12      0  

Inputs: 
----------
    <strong>Min</strong>       <strong>u</strong>       <strong>Max</strong>
    <strong>____</strong>    <strong>______</strong>    <strong>___</strong>

(1.) mpc_nloffsets/In1
    -Inf    -1.252    Inf

Outputs: 
----------
    <strong>Min</strong>        <strong>y</strong>        <strong>Max</strong>
    <strong>____</strong>    <strong>________</strong>    <strong>___</strong>

(1.) mpc_nloffsets/Out1
    -Inf    -0.52938    Inf

Извлеките номинальное состояние, выведите, и входные значения от вычисленной рабочей точки.

x0 = [op_report.States(1).x;op_report.States(2).x];
y0 = op_report.Outputs.y;
u0 = op_report.Inputs.u;

Линеаризуйте объект при начальном условии.

plant = linearize(plant_mdl,op_point);

Спроектируйте контроллер MPC

Создайте контроллер MPC объект с заданным шагом расчета Ts, горизонт предсказания p, и управляйте горизонтом m.

Ts = 0.1;
p = 20;
m = 3;
mpcobj = mpc(plant,Ts,p,m);
-->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.Model.Nominal = struct('X',x0,'U',u0,'Y',y0);

Установите выходную модель шума измерения (белый шум, обнулите среднее значение, отклонение = 0.01).

mpcobj.Model.Noise = 0.1;

Установите переменное ограничение, которым управляют.

mpcobj.MV.Max = 0.2;

Симулируйте Используя Simulink

Задайте ссылочное значение для выходного сигнала.

r0 = 1.5*y0;

Откройте и симулируйте модель.

mdl = 'mpc_offsets';
open_system(mdl)
sim(mdl)
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output channel #1 is integrated white noise.

Симулируйте Используя sim Команда

Симулируйте контроллер.

Tf = round(10/Ts);
r = r0*ones(Tf,1);
[y1,t1,u1,x1,xmpc1] = sim(mpcobj,Tf,r);

Постройте и сравните результаты симуляции.

subplot(1,2,1)
plot(y.time,y.signals.values,t1,y1,t1,r)
legend('Nonlinear','Linearized','Reference')
title('output')
grid
subplot(1,2,2)
plot(u.time,u.signals.values,t1,u1)
legend('Nonlinear','Linearized')
title('input')
grid

bdclose(plant_mdl)
bdclose(mdl)

Смотрите также

|

Для просмотра документации необходимо авторизоваться на сайте