Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.
Este ejemplo muestra cómo resolver un problema de colocación de polos utilizando el método de consecución de objetivos multiobjetivo. Este algoritmo se implementa en la función.fgoalattain
Considere una planta inestable de 2 entradas y 2 salidas. La ecuación que describe la evolución del sistema x (t) es
donde u (t) es la señal de entrada (control). La salida del sistema es
Las matrices A, B y C son
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 ];
Supongamos que la señal de control u (t) se establece como proporcional a la salida y (t):
para una matriz K.
Esto significa que la evolución del sistema x (t) es:
El objetivo de la optimización es diseñar K para tener las dos propiedades siguientes:
1. Las partes reales de los valores propios de (A + B * K * C) son más pequeñas que [-5,-3,-1]. (Esto se denomina colocación de polos en la literatura de control.)
2. ABS (K) < = 4 (cada elemento de K está entre-4 y 4)
Con el fin de resolver la optimización, primero establecer los objetivos multiobjetivos:
goal = [-5, -3, -1];
Establezca las ponderaciones iguales a los objetivos para garantizar el mismo porcentaje de logro bajo o exceso en los objetivos.
weight = abs(goal);
Inicializar el controlador de retroalimentación de salida
K0 = [ -1 -1; -1 -1];
Establezca los límites superior e inferior en el controlador
lb = repmat(-4,size(K0))
lb = 2×2
-4 -4
-4 -4
ub = repmat(4,size(K0))
ub = 2×2
4 4
4 4
Establezca el parámetro de visualización de optimización para dar salida en cada iteración:
options = optimoptions('fgoalattain','Display','iter');
Cree una función con valores vectoriales eigfun que devuelva los valores propios del sistema de bucle cerrado. Esta función requiere parámetros adicionales (es decir, las matrices A, B y C); la forma más conveniente de pasar estos es a través de una función anónima:
eigfun = @(K) sort(eig(A+B*K*C));
Para comenzar la optimización llamamos a FGOALALCANZ:
[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.0001548 1 -0.00812 Hessian modified twice 9 69 -0.3889 0.008327 1 -0.00751 Hessian modified 10 76 -0.3862 0 1 0.00568 11 83 -0.3863 3.081e-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.
El valor de los parámetros de control en la solución es:
K
K = 2×2
-4.0000 -0.2564
-4.0000 -4.0000
Los valores propios del sistema de lazo cerrado se encuentran en eigfun (K) de la siguiente manera: (también se mantienen en FVal de salida)
eigfun(K)
ans = 3×1
-6.9313
-4.1588
-1.4099
El factor de logro indica el nivel de logro de objetivos. Un factor de logro negativo indica un exceso de rendimiento, lo que indica que el rendimiento es menor. El factor de valor que hemos obtenido en esta carrera indica que los objetivos han sido sobrealcanzados por casi el 40 por ciento:
attainfactor
attainfactor = -0.3863
Aquí es cómo el sistema x (t) evoluciona desde el tiempo 0 al tiempo 4, utilizando la matriz de retroalimentación calculada K, a partir del punto x (0) = [1; 1; 1].
Primero resuelva la ecuación diferencial:
[Times, xvals] = ode45(@(u,x)((A + B*K*C)*x),[0,4],[1;1;1]);
A continuación, trace el resultado:
plot(Times,xvals) legend('x_1(t)','x_2(t)','x_3(t)','Location','best') xlabel('t'); ylabel('x(t)');
Supongamos que ahora requerimos que los valores autovalores estén lo más cerca posible de los valores del objetivo, [-5,-3,-1]. Configure las opciones. Goalsexactlograr el número de objetivos que deben ser lo más cerca posible de los objetivos (es decir, no tratar de sobrealcanzar):
Los tres objetivos deben ser lo más cerca posible de los objetivos.
options.GoalsExactAchieve = 3;
Estamos listos para llamar al solucionador de optimización:
[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 6.939e-18 0.005702 1 -0.116 Hessian modified 6 48 0 9.674e-06 1 -5.99e-16 Hessian modified 7 55 -2.06e-21 4.662e-11 1 -1.08e-16 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.
El valor de los parámetros de control en esta solución es:
K
K = 2×2
-1.5954 1.2040
-0.4201 -2.9046
Esta vez los valores propios del sistema de lazo cerrado, que también se mantienen en la salida FVal, son los siguientes:
eigfun(K)
ans = 3×1
-5.0000
-3.0000
-1.0000
El factor de logro es el nivel de logro de objetivos. Un factor de logro negativo indica un exceso de rendimiento, lo que indica que el rendimiento es menor. El factor de bajo nivel obtenido indica que los valores propios han alcanzado casi exactamente los objetivos:
attainfactor
attainfactor = -2.0602e-21
Aquí es cómo el sistema x (t) evoluciona desde el tiempo 0 al tiempo 4, utilizando la nueva matriz de retroalimentación calculada K, a partir del punto x (0) = [1; 1; 1].
Primero resuelva la ecuación diferencial:
[Times, xvals] = ode45(@(u,x)((A + B*K*C)*x),[0,4],[1;1;1]);
A continuación, trace el resultado:
plot(Times,xvals) legend('x_1(t)','x_2(t)','x_3(t)','Location','best') xlabel('t'); ylabel('x(t)');