exponenta event banner

Настройка весов ввода и вывода на основе анализа чувствительности

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

Определение модели завода

Создайте модель пространства состояния для завода.

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');

Проектирование контроллера 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.

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

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 = [1 1];

Установите весовые коэффициенты для скорости изменения обрабатываемых переменных.

mpcobj.Weights.ManipulatedVariablesRate = [.1 .1 .1];

Сохраните значения весов для обрабатываемых переменных на уровне значений по умолчанию. [0 0 0].

Настройка оценки производительности

Производительность замкнутого цикла по умолчанию выражается набором весов, которые отражают требуемое поведение замкнутого цикла. Веса содержатся в структуре с теми же полями, что и Weights свойства объекта MPC.

PerformanceWeights = mpcobj.weights;

В этом примере мы делаем веса на выходе более важными, чем веса на скоростях среднего напряжения при оценке производительности по замкнутому циклу.

PerformanceWeights.OutputVariables = [100 100]; 
PerformanceWeights.ManipulatedVariablesRate = [1 1 1];

Обратите внимание, что PerformanceWeights используется только при вычислении кумулятивного индекса производительности. Он не связан с весами, указанными в объекте контроллера MPC.

Настройка параметров моделирования

В этом примере мы проверяем только сценарий отслеживания уставок для анализа чувствительности.

Tstop = 80;              % time steps to simulate
r = ones(Tstop,1)*[1 1]; % set point signals
v = [];                  % no measured disturbance
simopt = mpcsimopt;
simopt.PlantInitialState = zeros(8,1);

Вычислить чувствительность

[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.
disp('')
disp('--------------')
--------------
disp('Sensitivity analysis')
Sensitivity analysis
disp('--------------')
--------------
disp('')
fprintf('Output weights:     dJ/dWy  = [%g, %g]\n',Sens1.OutputVariables);
Output weights:     dJ/dWy  = [-27345.7, 27166]
fprintf('Input weights:      dJ/dWu  = [%g, %g, %g]\n',Sens1.ManipulatedVariables);
Input weights:      dJ/dWu  = [3.33756, -125.827, -35.1066]
fprintf('Input-rate weights: dJ/dWdu = [%g, %g, %g]\n',Sens1.ManipulatedVariablesRate);
Input-rate weights: dJ/dWdu = [-7.30066, 10250.2, -8369.89]
disp('--------------')
--------------
disp('')

Настройка веса MPC

Поскольку мы всегда хотим уменьшить кумулятивный индекс производительности по замкнутому циклу J, в этом примере производные относительно выходных весов показывают, что вес на y1 следует увеличить, так как соответствующая производная отрицательна, в то время как вес на y2 следует уменьшить.

mpcobj_new = mpcobj;

Чувствительность менее 0 предполагает увеличение выходной массы с 1 до 2.

mpcobj_new.Weights.OutputVariables(1) = 2;

Чувствительность больше 0 предполагает снижение выходной массы с 1 до 0,2.

mpcobj_new.Weights.OutputVariables(2) = 0.2;

Обратите внимание, что анализ чувствительности указывает только направление изменения параметров, а не размер. Ожидаются проб и ошибок.

Проверка изменений производительности

[y1, t1] = sim(mpcobj, Tstop, r, v, simopt);
[y2, t2] = 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.
h = 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')

Figure contains 2 axes. Axes 1 with title Output #1 contains 3 objects of type line. These objects represent reference, original tuning, new tuning. Axes 2 with title Output #2 contains 3 objects of type line. These objects represent reference, original tuning, new tuning.

Проверка уменьшения кумулятивного индекса производительности

Пересчитайте только кумулятивный индекс производительности, используя тот же показатель производительности.

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.
fprintf('Previous Cumulated Performance Index J1 = %g\n',J1);
Previous Cumulated Performance Index J1 = 128645
fprintf('New Cumulated Performance Index J2 = %g\n',J2);
New Cumulated Performance Index J2 = 116234

Следует отметить, что абсолютное значение кумулятивного индекса производительности не является важным.

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

Это пример того, как записать определяемую пользователем функцию производительности, используемую sensitivity способ. В этом примере настраиваемая функция mpc_performance_function.m иллюстрирует реализацию индекса производительности ISE.

J3 = sensitivity(mpcobj,'mpc_performance_function',Tstop,r,PerformanceWeights);
fprintf('User Defined Cumulated Performance Index J3 = %g (same as J1).\n',J3);
User Defined Cumulated Performance Index J3 = 128645 (same as J1).

См. также

|