Этот пример показывает, как вычислить числовые производные совокупного индекса эффективности с обратной связью относительно весов и использовать их для улучшения эффективности прогнозирующего контроллера модели.
Создайте модель пространства состояний для объекта управления.
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 с заданным шагом расчета 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;
В этом примере мы делаем выходы веса более важными, чем веса на скоростях MV, при оценке эффективности с обратной связью.
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('')
Поскольку мы всегда хотим уменьшить совокупный индекс эффективности с обратной связью 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')
Пересчитайте только совокупный индекс эффективности с помощью того же показателя эффективности.
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).