Этот пример показывает, как задать масштабные коэффициенты в контроллере MPC, чтобы сделать вес, настраивающийся легче.
Дискретное время, линейная модель объекта управления пространства состояний имеет 10 состояний, 5 входных параметров и 3 выходных параметров.
[plant,Ts] = mpcscalefactor_model; [ny,nu] = size(plant.D);
Входные параметры объекта включают переменную, которой управляют, (MV), измеренное воздействие (MD) и неизмеренное воздействие (UD). Объект выходные параметры включает измеренные выходные параметры (MO) и неизмеренные выходные параметры (UO).
mvindex = [1, 3, 5]; mdindex = 4; udindex = 2; moindex = [1 3]; uoindex = 2; plant = setmpcsignals(plant,'MV',mvindex,'MD',mdindex,'UD',udindex,'MO',moindex,'UO',uoindex);
Номинальная стоимость и рабочие диапазоны модели объекта управления следующие:
Вход 1: номинальная стоимость равняется 100, область значений [50 150]
Вход 2: номинальная стоимость равняется 10, область значений [5 15]
Вход 3: номинальная стоимость 0.01, область значений [0.005 0.015]
Вход 4: номинальная стоимость 0.1, область значений [0.05 0.15]
Вход 5: номинальная стоимость равняется 1, область значений [0.5 1.5]
Вывод 1: номинальная стоимость 0.01, область значений [0.005 0.015]
Вывод 2: номинальная стоимость равняется 1, область значений [0.5 1.5]
Вывод 3: номинальная стоимость равняется 100, область значений [50 150]
Используйте команду lsim
, чтобы запустить разомкнутый цикл линейная симуляция, чтобы проверить, что объект, который выходные параметры в области значений и их среднем значении, близко к номинальной стоимости, когда входные сигналы отличаются случайным образом вокруг их номинальной стоимости.
Unominal = [100;10;0.01;0.1;1]; Ynominal = [0.01;1;100]; Uspan = Unominal; Yspan = Ynominal; t = (0:1000)'*Ts; nt = length(t); Uol = (rand(nt,nu)-0.5).*(ones(nt,1)*Uspan'); % design input signal Yol = lsim(plant,Uol,t); % compute plant output fprintf('The difference between average output values and the nominal values are %.2f%%, %.2f%%, %.2f%% respectively.\n',... abs(mean(Yol(:,1)))/Ynominal(1)*100,abs(mean(Yol(:,2)))/Ynominal(2)*100,abs(mean(Yol(:,3)))/Ynominal(3)*100);
The difference between average output values and the nominal values are 2.25%, 3.53%, 2.47% respectively.
Когда сигналы ввода и вывода объекта имеют различные порядки величины, настройки веса MPC по умолчанию часто дают низкую производительность.
Создайте контроллер MPC с весами по умолчанию:
Weight.MV = 0
Weight.MVRate = 0.1
Weight.OV = 1
C = mpc(plant);
-->The "PredictionHorizon" property of "mpc" object is empty. Trying PredictionHorizon = 10. -->The "ControlHorizon" property of the "mpc" object is empty. Assuming 2. -->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.
Xnominal = zeros(10,1); Unominal(udindex) = 0; % Nominal values for unmeasured disturbance must be 0 C.Model.Nominal = struct('X',Xnominal,'DX',Xnominal,'Y',Ynominal,'U',Unominal);
Во-первых, протестируйте последовательность изменений заданного значения шага в трех ссылочных сигналах.
nStepLen = 15; T1 = nStepLen*ny; r1 = ones(T1,1)*Ynominal(:)'; ii = 1; for i = 1:ny r1(ii:end,i) = r1(ii:end,i) + Ynominal(i); ii = ii + nStepLen; end sim(C,T1,r1)
-->The "Model.Disturbance" property of "mpc" object is empty: Assuming unmeasured input disturbance #2 is integrated white noise. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. Assuming no disturbance added to measured output channel #3. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Ответ отслеживания первого вывода плох. Причина состоит в том, что ее область значений является маленькой по сравнению с другими выходными параметрами. Если контроллер по умолчанию, настраивающий веса, используется, контроллер MPC не обращает много внимания на регулирование этого вывода, потому что связанный штраф является настолько маленьким по сравнению с другими выходными параметрами в целевой функции.
Во-вторых, протестируйте неизмеренное подавление помех.
SimOpt = mpcsimopt; SimOpt.UnmeasuredDisturbance = Uspan(udindex)'; T2 = 100; r2 = ones(T2,1)*Ynominal(:)'; sim(C,T2,r2,[],SimOpt)
Ответ подавления помех также плох. Ни одни из выходных параметров не возвращаются к их заданным значениям.
Определение масштабных коэффициентов ввода и вывода для контроллера MPC:
Улучшает числовое качество вычислений оптимизации и оценки состояния.
Делает его более вероятно, что настраивающие веса значения по умолчанию достигнут хорошей производительности контроллера.
Скопируйте контроллер MPC с весами по умолчанию.
C2 = C;
Чтобы задать масштабные коэффициенты, это - хорошая практика, чтобы использовать ожидаемый рабочий диапазон каждого ввода и вывода.
for i = 1:length(mvindex) C2.MV(i).ScaleFactor = Uspan(mvindex(i)); end nmd = length(mdindex); for i = 1:nmd C2.D(i).ScaleFactor = Uspan(mdindex(i)); end for i = 1:length(udindex) C2.D(i+nmd).ScaleFactor = Uspan(udindex(i)); end for i = 1:ny C2.OV(i).ScaleFactor = Yspan(i); end
Повторите первый тест, который является последовательностью изменений заданного значения шага в трех ссылочных сигналах.
sim(C2,T1,r1)
-->The "Model.Disturbance" property of "mpc" object is empty: Assuming unmeasured input disturbance #2 is integrated white noise. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. Assuming no disturbance added to measured output channel #3. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Повторите второй тест, который является неизмеренным воздействием.
sim(C2,T2,r2,[],SimOpt)
И отслеживание заданного значения и ответы подавления помех хороши даже, не настраивая веса MPC.