В этом примере показано, как вычислить числовые производные совокупной эффективности индексируют относительно весов MPC квадратичную функцию стоимости, и использовать эти производные, чтобы улучшать производительность.
Создайте модель в пространстве состояний для объекта.
plant = ss(tf({1,1,2;1 -1 -1},{[1 0 0],[1 0 0],[1 1];[1 2 8],[1 3],[1 1 3]}),'min');
Модель является непрерывным временем и имеет 3 входных параметров (принятый, чтобы быть переменными, которыми управляют), 2 выходных параметров (принятый, чтобы быть оба измеримой), и 8 переменных состояния.
Создайте контроллер MPC с шагом расчета 0.1
, горизонт предсказания 20
шаги и горизонт управления 3
шаги.
mpcobj = mpc(plant,0.1,20,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.
Установите ограничения на переменные, которыми управляют, и их скорости изменения.
for i = 1:3 mpcobj.MV(i).Min = -2; mpcobj.MV(i).Max = 2; mpcobj.MV(i).RateMin = -4; mpcobj.MV(i).RateMax = 4; end
Отобразите веса функции стоимости по умолчанию для выходных переменных, переменных, которыми управляют, и уровня переменных, которым управляют.
mpcobj.Weights.OutputVariables
ans = 1×2
1 1
mpcobj.Weights.ManipulatedVariables
ans = 1×3
0 0 0
mpcobj.Weights.ManipulatedVariablesRate
ans = 1×3
0.1000 0.1000 0.1000
Задайте совокупный индекс эффективности с обратной связью как взвешенный Интеграл Квадратной Ошибки (ISE) между сигналами объекта и их ссылками, вычисленными в интервале от 0
к Tstop
секунды.
Веса, которые отражают желаемое поведение с обратной связью, должны содержаться в структуре с теми же полями как Weights
свойство объекта MPC.
PerformanceWeights = mpcobj.weights;
В этом примере выходное отслеживание более важно, чем поддержание на низком уровне значений переменных, которыми управляют, поэтому, задает относительно более высокие веса на ошибке на выходе, немного более высокие веса на плавающем курсе, которым управляют, и сохраняет веса по умолчанию на значениях переменных, которыми управляют.
PerformanceWeights.OutputVariables = [100 100]; PerformanceWeights.ManipulatedVariablesRate = [1 1 1];
Обратите внимание на то, что PerformanceWeights
используется только, чтобы вычислить совокупный индекс эффективности. Это не связано с весами, заданными в контроллере MPC объект. Поэтому совокупный индекс эффективности не связан с квадратичной функцией стоимости, которую диспетчер MPC пытается минимизировать путем выбора значений переменных, которыми управляют. Действительно, индекс эффективности основан на симуляции замкнутого цикла до времени, которое обычно отличается, чем горизонт предсказания, в то время как контроллер MPC вычисляет перемещения, которые минимизируют его внутреннюю функцию стоимости до горизонта предсказания и способом разомкнутого контура. Кроме того, даже когда индекс эффективности выбран, чтобы иметь тип ISE, его веса должны быть в квадрате, чтобы совпадать с весами, заданными в функции стоимости MPC.
В этом примере вы вычисляете совокупную чувствительность индекса эффективности в рамках сценария отслеживания заданного значения.
Tstop = 80; % number of time steps to be simulated r = ones(Tstop,1)*[1 1]; % set point reference signals v = []; % no disturbance is added simopt = mpcsimopt; % create simulation options object simopt.PlantInitialState = zeros(8,1); % set plant initial state
Вычислите значение индекса эффективности и его чувствительность к mpcobj
веса функции стоимости, с помощью sensitivity
функция.
[J1, Sens1] = sensitivity(mpcobj, 'ISE', PerformanceWeights, Tstop, r, v, simopt);
-->Converting model to discrete time. Assuming no disturbance added to measured output channel #1. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Отобразите чувствительность относительно весов для сигналов ошибки на выходе, .
Sens1.OutputVariables
ans = 1×2
104 ×
-2.7346 2.7166
Отобразите чувствительность относительно весов для переменных сигналов, которыми управляют, .
Sens1.ManipulatedVariables
ans = 1×3
3.3375 -125.8266 -35.1067
Отобразите чувствительность относительно весов для сигналов уровня переменных, которыми управляют, .
Sens1.ManipulatedVariablesRate
ans = 1×3
104 ×
-0.0007 1.0250 -0.8370
Поскольку вы хотите уменьшать совокупный индекс эффективности с обратной связью J
, в этом примере производные относительно выходных весов показывают что вес на y1
должен быть увеличен, когда соответствующая производная отрицательна, в то время как вес на y2
должен быть уменьшен.
Скопируйте объект MPC сделать модификацию на новом объекте.
mpcobj_new = mpcobj;
Отрицательная чувствительность предлагает увеличить первый выходной вес с 1
к 2
.
mpcobj_new.Weights.OutputVariables(1) = 2;
Положительная чувствительность предлагает уменьшить второй выходной вес с 1
к 0.2
.
mpcobj_new.Weights.OutputVariables(2) = 0.2;
Обратите внимание на то, что анализ чувствительности только говорит вам в который направление изменить параметры, но не сколько. Процедура метода проб и ошибок, чтобы выбрать соответствующую величину изменения ожидается.
Симулируйте оба контроллера MPC.
[y1, t1, u1] = sim(mpcobj, Tstop, r, v, simopt); [y2, t2, u2] = sim(mpcobj_new, Tstop, r, v, simopt);
-->Converting model to discrete time. Assuming no disturbance added to measured output channel #1. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Постройте результаты симуляции для обоих контроллеров.
% plot plant outputs h1 = figure; subplot(211) plot(t2,r(:,1),t1,y1(:,1),t2,y2(:,1));grid legend('reference','original tuning','new tuning') title('Output #1') subplot(212) plot(t2,r(:,2),t1,y1(:,2),t2,y2(:,2));grid legend('reference','original tuning','new tuning') title('Output #2')
% plot manipulated variables h2 = figure; subplot(311) plot(t1,u1(:,1),t2,u2(:,1));grid legend('original tuning','new tuning') title('Manipulated Variable #1') subplot(312) plot(t1,u1(:,2),t2,u2(:,2));grid legend('original tuning','new tuning') title('Manipulated Variable #2') subplot(313) plot(t1,u1(:,3),t2,u2(:,3));grid legend('original tuning','new tuning') title('Manipulated Variable #3')
Вычислите совокупный индекс эффективности для нового контроллера, использующего тот же критерий качества работы.
J2 = sensitivity(mpcobj_new, 'ISE', PerformanceWeights, Tstop, r, v, simopt);
-->Converting model to discrete time. Assuming no disturbance added to measured output channel #1. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Предыдущий совокупный индекс эффективности.
J1
J1 = 1.2865e+05
Новый совокупный индекс эффективности.
J2
J2 = 1.1623e+05
Как ожидалось новое значение совокупного индекса эффективности ниже, чем старое значение.
Это - пример того, как записать пользовательскую функцию эффективности, используемую sensitivity
метод. В этом примере, пользовательском функциональном mpc_performance_function.m
реализует стандартный индекс эффективности ISE на основе PerformanceWeights
.
Отобразите функцию.
type mpc_performance_function.m
function J = mpc_performance_function(MPCobj, Tsteps, r, PerformanceWeights) % This is an example of how to write a user defined performance function % used by the "sensitivity" method. In this example, the code illustrate % how we use performance weights to compute the cumulative performance index. % Copyright 1990-2014 The MathWorks, Inc. % Carry out simulation [y,t,u] = sim(MPCobj, Tsteps, r); du = [u(1,:);diff(u)]; % Get Weights in MPCobj ny = size(MPCobj,'mo') + size(MPCobj,'uo'); nmv = size(MPCobj,'mv'); Wy = PerformanceWeights.OutputVariables(:);Wy=Wy(1:ny); Wu = PerformanceWeights.ManipulatedVariables(:);Wu=Wu(1:nmv); Wdu = PerformanceWeights.ManipulatedVariablesRate(:);Wdu=Wdu(1:nmv); % Set mv target to 0 utarget=zeros(nmv,1); % Compute J in ISE form J=0; aux=(y-r)*Wy; J=J+aux'*aux; aux=(u-ones(Tsteps,1)*utarget')*Wu; J=J+aux'*aux; aux=du*Wdu; J=J+aux'*aux;
Используйте пользовательскую функцию, чтобы вычислить индекс эффективности.
J3 = sensitivity(mpcobj,'mpc_performance_function',Tstop,r,PerformanceWeights)
J3 = 1.2865e+05
Как ожидалось, для mpcobj
, пользовательская Совокупная Эффективность индексирует J3
имеет то же значение как J1
.