Этот пример показывает, как решить задачу размещения полюсов с помощью метода мультиобъективного достижения цели. Этот алгоритм реализован в функции fgoalattain
.
Рассмотрим 2-входный 2-выходной нестабильный объект. Уравнение, описывающее эволюцию системы является
где - вход (управляющий) сигнал. Выходные выходы системы:
Матрицы , , и являются
A = [ -0.5 0 0; 0 -2 10; 0 1 -2 ]; B = [ 1 0; -2 2; 0 1 ]; C = [ 1 0 0; 0 0 1 ];
Предположим, что сигнал управления задается как пропорциональный выходу :
для некоторой матрицы .
Это означает, что эволюция системы является:
Объект оптимизации состоит в том, чтобы спроектировать иметь следующие два свойства:
1. Действительные части собственных значений меньше [-5, -3, -1]. (Это называется размещением полюса в литературе по управлению.)
2. abs () < = 4 (каждый элемент находится между -4 и 4)
В порядок решения оптимизации сначала установите мультиобъективные цели:
goal = [-5, -3, -1];
Установите веса равными целям, чтобы гарантировать одинаковый процент недостаточного или избыточного достижения в целях.
weight = abs(goal);
Инициализируйте выход контроллер обратной связи
K0 = [ -1 -1; -1 -1];
Установите верхнюю и нижнюю границы контроллера
lb = repmat(-4,size(K0))
lb = 2×2
-4 -4
-4 -4
ub = repmat(4,size(K0))
ub = 2×2
4 4
4 4
Установите параметр отображения оптимизации, чтобы выдать выход при каждой итерации:
options = optimoptions('fgoalattain','Display','iter');
Создайте векторно-значимую функцию eigfun, которая возвращает собственные значения системы замкнутого цикла. Эта функция требует дополнительных параметров (а именно, матриц , , и ); самый удобный способ их прохождения - через анонимную функцию:
eigfun = @(K) sort(eig(A+B*K*C));
Чтобы начать оптимизацию, мы вызываем fgoalattain
:
[K,~,attainfactor] = ...
fgoalattain(eigfun,K0,goal,weight,[],[],[],[],lb,ub,[],options);
Attainment Max Line search Directional Iter F-count factor constraint steplength derivative Procedure 0 6 0 1.88521 1 13 1.031 0.02998 1 0.745 2 20 0.3525 0.06863 1 -0.613 3 27 -0.1706 0.1071 1 -0.223 Hessian modified 4 34 -0.2236 0.06654 1 -0.234 Hessian modified twice 5 41 -0.3568 0.007894 1 -0.0812 6 48 -0.3645 0.000145 1 -0.164 Hessian modified 7 55 -0.3645 0 1 -0.00515 Hessian modified 8 62 -0.3675 0.0001546 1 -0.00812 Hessian modified twice 9 69 -0.3889 0.008328 1 -0.00751 Hessian modified 10 76 -0.3862 0 1 0.00568 11 83 -0.3863 2.955e-13 1 -0.998 Hessian modified twice Local minimum possible. Constraints satisfied. fgoalattain stopped because the size of the current search direction is less than twice the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
Значение параметров управления в решении:
K
K = 2×2
-4.0000 -0.2564
-4.0000 -4.0000
Собственные значения системы замкнутого цикла находятся в eigfun (K) следующим образом: (они также удерживаются в выходе fval)
eigfun(K)
ans = 3×1
-6.9313
-4.1588
-1.4099
Коэффициент достижения указывает на уровень достижения цели. Отрицательный коэффициент достижения указывает на избыточное достижение, положительный указывает на недостаточное достижение. Достигнутый нами в этом запуске показатель значения показывает, что цели были слишком достигнуты почти на 40 процентов:
attainfactor
attainfactor = -0.3863
Вот как система развивается от времени 0 до времени 4, используя вычисленную матрицу обратной связи , начиная с точки x (0) = [1; 1; 1].
Сначала решите дифференциальное уравнение:
[Times, xvals] = ode45(@(u,x)((A + B*K*C)*x),[0,4],[1;1;1]);
Затем постройте график результата:
plot(Times,xvals) legend('x_1(t)','x_2(t)','x_3(t)','Location','best') xlabel('t'); ylabel('x(t)');
Предположим, что теперь мы требуем, чтобы собственные значения были как можно ближе к значениям цели, [-5, -3, -1]. Задайте options.EqualityGoalCount
к числу задач, которые должны быть как можно ближе к целям (т.е. не пытаться достичь сверх):
Все три задачи должны быть как можно ближе к целям.
options.EqualityGoalCount = 3;
Мы готовы вызвать решатель оптимизации:
[K,fval,attainfactor,exitflag,output,lambda] = ...
fgoalattain(eigfun,K0,goal,weight,[],[],[],[],lb,ub,[],options);
Attainment Max Line search Directional Iter F-count factor constraint steplength derivative Procedure 0 6 0 1.88521 1 13 1.031 0.02998 1 0.745 2 20 0.3525 0.06863 1 -0.613 3 27 0.1528 -0.009105 1 -0.22 Hessian modified 4 34 0.02684 0.03722 1 -0.166 Hessian modified 5 41 4.51e-17 0.005703 1 -0.116 Hessian modified 6 48 -1.242e-18 9.626e-06 1 -3.99e-15 Hessian modified 7 55 -6.783e-22 4.925e-11 1 6.55e-14 Hessian modified Local minimum possible. Constraints satisfied. fgoalattain stopped because the size of the current search direction is less than twice the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
Значение параметров управления в этом решении является:
K
K = 2×2
-1.5953 1.2040
-0.4201 -2.9047
На этот раз собственные значения системы с обратным циклом, которые также удерживаются в выходном fval, следующие:
eigfun(K)
ans = 3×1
-5.0000
-3.0000
-1.0000
Фактором достижения является уровень достижения цели. Отрицательный коэффициент достижения указывает на избыточное достижение, положительный указывает на недостаточное достижение. Полученный низкий достижимый коэффициент указывает, что собственные значения почти точно достигли целей:
attainfactor
attainfactor = -6.7825e-22
Вот как система развивается от времени 0 до времени 4, используя новую вычисленную матрицу обратной связи , начиная с точки x (0) = [1; 1; 1].
Сначала решите дифференциальное уравнение:
[Times, xvals] = ode45(@(u,x)((A + B*K*C)*x),[0,4],[1;1;1]);
Затем постройте график результата:
plot(Times,xvals) legend('x_1(t)','x_2(t)','x_3(t)','Location','best') xlabel('t'); ylabel('x(t)');