Этот пример показывает, как решить проблему размещения полюса с помощью многоцелевого целевого метода достижения. Этот алгоритм реализован в функциональном fgoalattain
.
Рассмотрите нестабильный объект с 2 выводами с 2 входами. Уравнение, описывающее эволюцию системы x (t),
где u (t) является входом (управление) сигнал. Вывод системы
Матрицы A, B, и C
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 ];
Предположим, что управляющий сигнал u (t) установлен как пропорциональный выводу y (t):
для некоторой матрицы K.
Это означает, что эволюция системы x (t):
Объект оптимизации к проекту K, чтобы иметь следующие два свойства:
1. Действительные части собственных значений (+ B*K*C) меньше, чем [-5,-3,-1]. (Это называется размещением полюса в литературе управления.)
2. abs (K) <= 4 (каждый элемент K между-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, который возвращает собственные значения системы замкнутого цикла. Эта функция требует дополнительных параметров (а именно, матрицы A, B, и C); наиболее удобный способ передать их через анонимную функцию:
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 8.058e-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
Фактор достижения указывает на уровень целевого достижения. Отрицательный фактор достижения указывает, что сверхдостижение, положительное, указывает на низкую успеваемость. Значение attainfactor, который мы получили в этом выполнении, указывает, что цели были сверхдостигнуты почти на 40 процентов:
attainfactor
attainfactor = -0.3863
Вот то, как система x (t) развивается со времени 0 ко времени 4, с помощью расчетной матрицы K обратной связи, начиная с точки 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.GoalsExactAchieve = 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 -1.041e-17 0.005702 1 -0.116 Hessian modified 6 48 -1.163e-18 9.705e-06 1 7.98e-16 Hessian modified 7 55 5.209e-21 4.957e-11 1 6.12e-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.5954 1.2040
-0.4201 -2.9046
На этот раз собственные значения системы замкнутого цикла, которые также сохранены в выводе fval, следующие:
eigfun(K)
ans = 3×1
-5.0000
-3.0000
-1.0000
Фактором достижения является уровень целевого достижения. Отрицательный фактор достижения указывает, что сверхдостижение, положительное, указывает на низкую успеваемость. Низкий полученный attainfactor указывает, что собственные значения почти точно удовлетворили целям:
attainfactor
attainfactor = 5.2086e-21
Вот то, как система x (t) развивается со времени 0 ко времени 4, с помощью новой расчетной матрицы K обратной связи, начиная с точки 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)');