В этом примере показано, как использовать Robust Control Toolbox™ для разработки устойчивого контроллера (с помощью итерации D-K) и для анализа робастности задачи управления процессами. В нашем примере объект является простой системой с двумя резервуарами.
Дополнительные экспериментальные работы, относящиеся к этой системе, описаны Smith et al. в следующих ссылках:
Smith, R.S., J. Doyle, M. Morari, and A. Skjellum, «A Case Study Using mu: Laboratory Process Control Problem», Processions of the X IFAC World Congress, vol. 8, pp. 403-415, 1987.
Smith, R.S, and J. Doyle, The Two Tank Experiment: A Benchmark Control Problem, in Proceedings American Control Conference, vol. 3, pp. 403-415, 1988.
Smith, R.S., and J. C. Doyle, «Closed Loop Relay Estimation of Secrety Bounds for Robust Control Models», в трудах 12-го Всемирного конгресса IFAC, vol. 9, pp. 57-60, July 1993.
Объект в нашем примере состоит из двух баков с водой в каскаде, как схематически показано на Фигуру 1. Верхний бак (бак 1) питается горячей и холодной водой через управляемые компьютером клапаны. Нижний бак (бак 2) подается водой из выхода в нижней части бака 1. Переполнение поддерживает постоянный уровень в баке 2. Поток смещения холодной воды также подает бак 2 и позволяет бакам иметь различные установившиеся температуры.
Наша цель проекта состоит в том, чтобы контролировать температуры обоих баков 1 и 2. Контроллер имеет доступ к ссылочным командам и измерениям температуры.

Фигура 1: Принципиальная схема системы с двумя резервуарами
Дадим объект переменным следующие обозначения:
fhc: Команда на привод горячего потока
fh: Поток горячей воды в бак 1
fcc: Команда на привод холодного потока
fc: Поток холодной воды в бак 1
f1: Общий расход жидкости из бака 1
A1: Площадь поперечного сечения бака 1
h1: Уровень воды в баке 1
t1:: Температура бака 1
t2:: Температура бака 2
A2Площадь поперечного сечения бака 2
h2: Уровень воды в баке 2
fb: Скорость потока жидкости бака 2
tb: Температура потока смещения бака 2
th: Температура горячего водоснабжения
tc: Температура холодного водоснабжения
Для удобства зададим систему нормированных модулей следующим образом:
Variable Unit Name 0 means: 1 means: -------- --------- -------- -------- temperature tunit cold water temp. hot water temp. height hunit tank empty tank full flow funit zero input flow max. input flow
Используя вышеуказанные модули, это параметры объекта управления:
A1 = 0.0256; % Area of tank 1 (hunits^2) A2 = 0.0477; % Area of tank 2 (hunits^2) h2 = 0.241; % Height of tank 2, fixed by overflow (hunits) fb = 3.28e-5; % Bias stream flow (hunits^3/sec) fs = 0.00028; % Flow scaling (hunits^3/sec/funit) th = 1.0; % Hot water supply temp (tunits) tc = 0.0; % Cold water supply temp (tunits) tb = tc; % Cold bias stream temp (tunits) alpha = 4876; % Constant for flow/height relation (hunits/funits) beta = 0.59; % Constant for flow/height relation (hunits)
Переменная fs является масштабирующим коэффициент потока, который преобразует вход (0 в 1 фуниты) в поток в hunits ^ 3/second. Константы альфа и бета описывают отношение расход/высота для бака 1:
h1 = альфа * f1-бета.
Мы можем получить номинальные модели бака путем линеаризации вокруг следующей рабочей точки (все нормированные значения):
h1ss = 0.75; % Water level for tank 1 t1ss = 0.75; % Temperature of tank 1 f1ss = (h1ss+beta)/alpha; % Flow tank 1 -> tank 2 fss = [th,tc;1,1]\[t1ss*f1ss;f1ss]; fhss = fss(1); % Hot flow fcss = fss(2); % Cold flow t2ss = (f1ss*t1ss + fb*tb)/(f1ss + fb); % Temperature of tank 2
Номинальная модель для бака 1 имеет входы [fh; fc] и выходы [h1; t1]:
A = [ -1/(A1*alpha), 0;
(beta*t1ss)/(A1*h1ss), -(h1ss+beta)/(alpha*A1*h1ss)];
B = fs*[ 1/(A1*alpha), 1/(A1*alpha);
th/A1, tc/A1];
C = [ alpha, 0;
-alpha*t1ss/h1ss, 1/h1ss];
D = zeros(2,2);
tank1nom = ss(A,B,C,D,'InputName',{'fh','fc'},'OutputName',{'h1','t1'});
clf
step(tank1nom), title('Step responses of Tank 1')

Фигура 2: Переходные характеристики бака 1.
Номинальная модель для бака 2 имеет входы [|h1|;|t1|] и выход t2:
A = -(h1ss + beta + alpha*fb)/(A2*h2*alpha); B = [ (t2ss+t1ss)/(alpha*A2*h2), (h1ss + beta)/(alpha*A2*h2) ]; C = 1; D = zeros(1,2); tank2nom = ss(A,B,C,D,'InputName',{'h1','t1'},'OutputName','t2'); step(tank2nom), title('Step responses of Tank 2')

Фигура 3: Переходные характеристики бака 2.
Существует значительная динамика и насыщенность, связанные с приводами, поэтому мы хотим включить модели приводов. В области значений, который мы используем, мы можем смоделировать приводы как систему первого порядка с насыщенностью скорости и величины. Это предел скорости, а не положение шеста, который ограничивает эффективность привода для большинства сигналов. Для линейной модели некоторые эффекты ограничения скорости могут быть включены в модель возмущения.
Мы первоначально настраивали модель привода с одним входом (команда сигнал) и двумя выходами (приведенный в действие сигнал и его производная). Мы будем использовать производный выход в ограничении скорости приведения в действие при разработке закона управления.
act_BW = 20; % Actuator bandwidth (rad/sec) actuator = [ tf(act_BW,[1 act_BW]); tf([act_BW 0],[1 act_BW]) ]; actuator.OutputName = {'Flow','Flow rate'}; bodemag(actuator) title('Valve actuator dynamics') hot_act = actuator; set(hot_act,'InputName','fhc','OutputName',{'fh','fh_rate'}); cold_act =actuator; set(cold_act,'InputName','fcc','OutputName',{'fc','fc_rate'});

Фигура 4: Динамика привода клапана.
Все измеренные сигналы фильтруются фильтрами Баттерворта четвертого порядка, каждый с частотой отключения 2,25 Гц.
fbw = 2.25; % Anti-aliasing filter cut-off (Hz) filter = mkfilter(fbw,4,'Butterw'); h1F = filter; t1F = filter; t2F = filter;
Эксперименты без разомкнутого контура показывают некоторую изменчивость в откликах системы и предполагают, что линейные модели хороши на низкой частоте. Если мы не примем во внимание эту информацию во время проекта, наш контроллер может плохо работать в реальной системе. По этой причине мы создадим модель неопределенности, которая максимально соответствует нашей оценке неопределенности в физической системе. Поскольку количество неопределенности модели или изменчивости обычно зависит от частоты, наша модель неопределенности включает частотно-зависимые функции взвешивания для нормализации ошибок моделирования на частоте.
Для примера разомкнутого контура эксперименты указывают на значительное количество динамической неопределенности в t1 ответ. Это связано, в основном, с перемешиванием и потерями тепла. Мы можем смоделировать его как мультипликативную (относительную) ошибку модели, Delta2 в t1 выход. Точно так же мы можем добавить мультипликативные ошибки модели Delta1 и Delta3 к h1 и t2 выходы, показанные на фигуре 5.

Фигура 5: Схематическое представление возмущенной линейной двухбаковой системы.
Чтобы завершить модель неопределенности, мы количественно определяем, насколько большие ошибки моделирования как функция частоты. Хотя трудно точно определить количество неопределенности в системе, мы можем искать грубые границы, основанные на частотных областях значений, где линейная модель точна или плоха, как в этих случаях:
Номинальная модель для h1 очень точен до по меньшей мере 0,3 Гц.
Эксперименты с предельным циклом в t1 цикл предполагает, что неопределенность должна доминировать выше 0,02 Гц.
Существуют около 180 степени дополнительной задержки фазы в t1 модель около 0,02 Гц. На этой частоте также наблюдается значительный убыток от прироста. Эти эффекты являются результатом немодулированной динамики смешивания.
Пределы циклом в t2 цикл предполагает, что неопределенность должна доминировать выше 0,03 Гц.
Эти данные предполагают следующие варианты для частотно-зависимых границ ошибки моделирования.
Wh1 = 0.01+tf([0.5,0],[0.25,1]); Wt1 = 0.1+tf([20*h1ss,0],[0.2,1]); Wt2 = 0.1+tf([100,0],[1,21]); clf bodemag(Wh1,Wt1,Wt2), title('Relative bounds on modeling errors') legend('h1 dynamics','t1 dynamics','t2 dynamics','Location','NorthWest')

Фигура 6. Относительные ограничения ошибок моделирования.
Теперь мы готовы создать неопределенные модели бака, которые захватывают ошибки моделирования, обсужденные выше.
% Normalized error dynamics delta1 = ultidyn('delta1',[1 1]); delta2 = ultidyn('delta2',[1 1]); delta3 = ultidyn('delta3',[1 1]); % Frequency-dependent variability in h1, t1, t2 dynamics varh1 = 1+delta1*Wh1; vart1 = 1+delta2*Wt1; vart2 = 1+delta3*Wt2; % Add variability to nominal models tank1u = append(varh1,vart1)*tank1nom; tank2u = vart2*tank2nom; tank1and2u = [0 1; tank2u]*tank1u;
Далее мы случайным образом выберем неопределенность, чтобы увидеть, как ошибки моделирования могут повлиять на отклики бака
step(tank1u,1000), title('Variability in responses due to modeling errors (Tank 1)')

Фигура 7: Изменчивость откликов из-за ошибок моделирования (Бак 1).
Теперь давайте рассмотрим задачу системы управления. Мы заинтересованы в отслеживании команд уставки для t1 и t2. Чтобы использовать преимущества алгоритмов разработки H-бесконечности, мы должны сформулировать проект как задачу минимизации усиления с обратной связью. Для этого мы выбираем функции взвешивания, которые захватывают характеристики нарушения порядка и требования к эффективности, чтобы помочь нормализовать соответствующие частотно-зависимые ограничения усиления.
Вот подходящая взвешенная передаточная функция без разомкнутого контура для задачи с двумя резервуарами:

Фигура 8: Система управления соединение для двухбаковой системы.
Затем мы выбираем веса для шумов датчика, команд уставки, ошибок отслеживания и приводов горячего/холодного действия.
Динамика датчика незначительна относительно динамики остальной части системы. Это не относится к шуму датчика. Потенциальные источники шума включают электронный шум в компенсаторах термопар, усилителях и фильтрах, излучаемый шум от мешалок и плохое заземление. Мы используем сглаженный анализ БПФ для оценки уровня шума, который предполагает следующие веса:
Wh1noise = zpk(0.01); % h1 noise weight Wt1noise = zpk(0.03); % t1 noise weight Wt2noise = zpk(0.03); % t2 noise weight
Веса ошибок штрафуют ошибки отслеживания уставки на t1 и t2. Мы выберем lowpass первого порядка для этих весов. Мы используем более высокий вес (лучшее отслеживание) для t1 потому что физические факторы заставляют нас верить в это t1 легче контролировать, чем t2.
Wt1perf = tf(100,[400,1]); % t1 tracking error weight Wt2perf = tf(50,[800,1]); % t2 tracking error weight clf bodemag(Wt1perf,Wt2perf) title('Frequency-dependent penalty on setpoint tracking errors') legend('t1','t2')

Фигура 9: Частотно-зависимый штраф от ошибок отслеживания уставки.
Ссылки (уставки) отражают частотное содержимое таких команд. Поскольку большая часть воды, поступающей в бак 2, поступает из бака 1, изменяется в t2 преобладают изменения в t1. Также t2 обычно командуется значение, близкое к t1. Поэтому имеет больше смысла использовать взвешивание уставки, выраженное в терминах t1 и t2-t1:
t1cmd = Wt1cmd * w1
t2cmd = Wt1cmd * w1 + Wtdiffcmd * w2
где w1, w2 - входы белого шума. Адекватный выбор веса:
Wt1cmd = zpk(0.1); % t1 input command weight Wtdiffcmd = zpk(0.01); % t2 - t1 input command weight
Наконец, мы хотели бы наказать и амплитуду, и скорость привода. Мы делаем это путем взвешивания fhc (и fcc) с функцией, которая накатывается на высоких частотах. Кроме того, мы можем создать модель привода с fh и d'fh|/dt как выходы и взвешивать каждый выход отдельно с постоянными весами. Этот подход имеет преимущество уменьшения количества состояний в взвешенной модели разомкнутого контура.
Whact = zpk(0.01); % Hot actuator penalty Wcact = zpk(0.01); % Cold actuator penalty Whrate = zpk(50); % Hot actuator rate penalty Wcrate = zpk(50); % Cold actuator rate penalty
Теперь, когда мы смоделировали все компоненты объекта и выбрали наши веса проекта, мы будем использовать connect функция для построения неопределенной модели взвешенной модели без разомкнутого контура, показанной на фигуре 8.
inputs = {'t1cmd', 'tdiffcmd', 't1noise', 't2noise', 'fhc', 'fcc'};
outputs = {'y_Wt1perf', 'y_Wt2perf', 'y_Whact', 'y_Wcact', ...
'y_Whrate', 'y_Wcrate', 'y_Wt1cmd', 'y_t1diffcmd', ...
'y_t1Fn', 'y_t2Fn'};
hot_act.InputName = 'fhc'; hot_act.OutputName = {'fh' 'fh_rate'};
cold_act.InputName = 'fcc'; cold_act.OutputName = {'fc' 'fc_rate'};
tank1and2u.InputName = {'fh','fc'};
tank1and2u.OutputName = {'t1','t2'};
t1F.InputName = 't1'; t1F.OutputName = 'y_t1F';
t2F.InputName = 't2'; t2F.OutputName = 'y_t2F';
Wt1cmd.InputName = 't1cmd'; Wt1cmd.OutputName = 'y_Wt1cmd';
Wtdiffcmd.InputName = 'tdiffcmd'; Wtdiffcmd.OutputName = 'y_Wtdiffcmd';
Whact.InputName = 'fh'; Whact.OutputName = 'y_Whact';
Wcact.InputName = 'fc'; Wcact.OutputName = 'y_Wcact';
Whrate.InputName = 'fh_rate'; Whrate.OutputName = 'y_Whrate';
Wcrate.InputName = 'fc_rate'; Wcrate.OutputName = 'y_Wcrate';
Wt1perf.InputName = 'u_Wt1perf'; Wt1perf.OutputName = 'y_Wt1perf';
Wt2perf.InputName = 'u_Wt2perf'; Wt2perf.OutputName = 'y_Wt2perf';
Wt1noise.InputName = 't1noise'; Wt1noise.OutputName = 'y_Wt1noise';
Wt2noise.InputName = 't2noise'; Wt2noise.OutputName = 'y_Wt2noise';
sum1 = sumblk('y_t1diffcmd = y_Wt1cmd + y_Wtdiffcmd');
sum2 = sumblk('y_t1Fn = y_t1F + y_Wt1noise');
sum3 = sumblk('y_t2Fn = y_t2F + y_Wt2noise');
sum4 = sumblk('u_Wt1perf = y_Wt1cmd - t1');
sum5 = sumblk('u_Wt2perf = y_Wtdiffcmd + y_Wt1cmd - t2');
% This produces the uncertain state-space model
P = connect(tank1and2u,hot_act,cold_act,t1F,t2F,Wt1cmd,Wtdiffcmd,Whact, ...
Wcact,Whrate,Wcrate,Wt1perf,Wt2perf,Wt1noise,Wt2noise, ...
sum1,sum2,sum3,sum4,sum5,inputs,outputs);
disp('Weighted open-loop model: ')
P
Weighted open-loop model:
P =
Uncertain continuous-time state-space model with 10 outputs, 6 inputs, 18 states.
The model uncertainty consists of the following blocks:
delta1: Uncertain 1x1 LTI, peak gain = 1, 1 occurrences
delta2: Uncertain 1x1 LTI, peak gain = 1, 1 occurrences
delta3: Uncertain 1x1 LTI, peak gain = 1, 1 occurrences
Type "P.NominalValue" to see the nominal value, "get(P)" to see all properties, and "P.Uncertainty" to interact with the uncertain elements.
Путем построения весов и взвешенного разомкнутого контура, показанного на фиг.8, мы пересчитали задачу управления как минимизацию усиления с обратной связью. Теперь мы можем легко вычислить закон управления с минимизацией усиления для номинальных моделей бака:
nmeas = 4; % Number of measurements nctrls = 2; % Number of controls [k0,g0,gamma0] = hinfsyn(P.NominalValue,nmeas,nctrls); gamma0
gamma0 =
0.9016
Наименьший достижимый коэффициент усиления в системе с обратной связью составляет около 0,9, что показывает нам, что наши спецификации эффективности отслеживания частотного диапазона выполняются контроллером k0. Симуляция этого проекта во временном интервале является разумным способом проверить, что мы правильно установили веса эффективности. Во-первых, мы создадим модель с обратной связью, отображающую входные сигналы [t1ref; t2ref; t1noise; t2noise] к выходным сигналам [h1; t1; t2; fhc; fcc]:
inputs = {'t1ref', 't2ref', 't1noise', 't2noise', 'fhc', 'fcc'};
outputs = {'y_tank1', 'y_tank2', 'fhc', 'fcc', 'y_t1ref', 'y_t2ref', ...
'y_t1Fn', 'y_t2Fn'};
hot_act(1).InputName = 'fhc'; hot_act(1).OutputName = 'y_hot_act';
cold_act(1).InputName = 'fcc'; cold_act(1).OutputName = 'y_cold_act';
tank1nom.InputName = [hot_act(1).OutputName cold_act(1).OutputName];
tank1nom.OutputName = 'y_tank1';
tank2nom.InputName = tank1nom.OutputName;
tank2nom.OutputName = 'y_tank2';
t1F.InputName = tank1nom.OutputName(2); t1F.OutputName = 'y_t1F';
t2F.InputName = tank2nom.OutputName; t2F.OutputName = 'y_t2F';
I_tref = zpk(eye(2));
I_tref.InputName = {'t1ref', 't2ref'}; I_tref.OutputName = {'y_t1ref', 'y_t2ref'};
sum1 = sumblk('y_t1Fn = y_t1F + t1noise');
sum2 = sumblk('y_t2Fn = y_t2F + t2noise');
simlft = connect(tank1nom,tank2nom,hot_act(1),cold_act(1),t1F,t2F,I_tref,sum1,sum2,inputs,outputs);
% Close the loop with the H-infinity controller |k0|
sim_k0 = lft(simlft,k0);
sim_k0.InputName = {'t1ref'; 't2ref'; 't1noise'; 't2noise'};
sim_k0.OutputName = {'h1'; 't1'; 't2'; 'fhc'; 'fcc'};
Теперь моделируем реакцию с обратной связью при нарастании уставок на t1 и t2 от 80 секунд до 100 секунд:
time=0:800; t1ref = (time>=80 & time<100).*(time-80)*-0.18/20 + ... (time>=100)*-0.18; t2ref = (time>=80 & time<100).*(time-80)*-0.2/20 + ... (time>=100)*-0.2; t1noise = Wt1noise.k * randn(size(time)); t2noise = Wt2noise.k * randn(size(time)); y = lsim(sim_k0,[t1ref ; t2ref ; t1noise ; t2noise],time);
Далее добавим моделируемые выходы к их устойчивым состояниям значениям и постройм график откликов:
h1 = h1ss+y(:,1); t1 = t1ss+y(:,2); t2 = t2ss+y(:,3); fhc = fhss/fs+y(:,4); % Note scaling to actuator fcc = fcss/fs+y(:,5); % Limits (0<= fhc <= 1) etc.
В этом коде мы строим графики выходов t1 и t2, а также высота h1 бака 1:
plot(time,h1,'--',time,t1,'-',time,t2,'-.'); xlabel('Time (sec)') ylabel('Measurements') title('Step Response of H-infinity Controller k0') legend('h1','t1','t2'); grid

Фигура 10: Переходная характеристика контроллера k0 H-бесконечности.
Далее строим графики команд на горячий и холодный приводы.
plot(time,fhc,'-',time,fcc,'-.'); xlabel('Time: seconds') ylabel('Actuators') title('Actuator Commands for H-infinity Controller k0') legend('fhc','fcc'); grid

Фигура 11: Команды привода для контроллера H-бесконечности k0.
Контроллер H-бесконечности k0 предназначен для номинальных моделей бака. Давайте рассмотрим, насколько хорошо ее тарифы для возмущенной модели в пределах неопределенности модели. Мы можем сравнить номинальную эффективность с обратной связью gamma0 с наихудшей эффективностью по сравнению с набором неопределенностей модели. (для получения дополнительной информации см. неопределенность в динамике модели»).
clpk0 = lft(P,k0);
% Compute and plot worst-case gain
wcsigmaplot(clpk0,{1e-4,1e2})
ylim([-20 10])

Фигура 12: Анализ эффективности для контроллера k0.
Худшая эффективность замкнутого контура значительно хуже номинальной эффективности, которая говорит нам, что контроллер H-бесконечности k0 не является устойчивым к ошибкам моделирования.
Чтобы исправить это отсутствие робастности, мы будем использовать musyn для разработки контроллера, который учитывает неопределенность моделирования и обеспечивает последовательную эффективность для номинальных и возмущенных моделей.
[kmu,bnd] = musyn(P,nmeas,nctrls);
D-K ITERATION SUMMARY:
-----------------------------------------------------------------
Robust performance Fit order
-----------------------------------------------------------------
Iter K Step Peak MU D Fit D
1 8.814 2.862 2.888 4
2 2.497 2.092 2.112 10
3 1.351 1.329 1.337 10
4 1.201 1.198 1.209 16
5 1.191 1.19 1.196 16
6 1.192 1.19 1.196 20
Best achieved robust performance: 1.19
Как и прежде, мы можем симулировать отклики с обратной связью с контроллером kmu
sim_kmu = lft(simlft,kmu); y = lsim(sim_kmu,[t1ref;t2ref;t1noise;t2noise],time); h1 = h1ss+y(:,1); t1 = t1ss+y(:,2); t2 = t2ss+y(:,3); fhc = fhss/fs+y(:,4); % Note scaling to actuator fcc = fcss/fs+y(:,5); % Limits (0<= fhc <= 1) etc. % Plot |t1| and |t2| as well as the height |h1| of tank 1 plot(time,h1,'--',time,t1,'-',time,t2,'-.'); xlabel('Time: seconds') ylabel('Measurements') title('Step Response of mu Controller kmu') legend('h1','t1','t2'); grid

Фигура 13: Переходная характеристика mu контроллера kmu.
Эти временные отклики сопоставимы с таковыми для k0, и показать лишь незначительное ухудшение эффективности. Однако kmu тарифы лучше относительно робастности к немоделированной динамике.
% Worst-case performance for kmu
clpmu = lft(P,kmu);
wcsigmaplot(clpmu,{1e-4,1e2})
ylim([-20 10])

Фигура 14: Анализ эффективности для контроллера kmu.
Можно использовать wcgain непосредственно вычислить коэффициент усиления в худшем случае на частоте (наихудший случай пикового усиления или наихудшая норма H-бесконечности). Можно также вычислить его чувствительность к каждому неопределенному элементу. Результаты показывают, что пик усиления в худшем случае наиболее чувствителен к изменениям в области значений delta2.
opt = wcOptions('Sensitivity','on'); [wcg,wcu,wcinfo] = wcgain(clpmu,opt); wcg
wcg =
struct with fields:
LowerBound: 1.3143
UpperBound: 1.3171
CriticalFrequency: 0
wcinfo.Sensitivity
ans =
struct with fields:
delta1: 0
delta2: 59
delta3: 10