Funciones de salida para Optimization Toolbox
¿Qué es una función de salida?
Para algunos problemas, puede que desee ver la salida de un algoritmo de optimización en cada iteración. Por ejemplo, puede que desee encontrar la secuencia de puntos que el algoritmo calcula y representar esos puntos. Para hacerlo, cree una función de salida a la que la función de optimización llame en cada iteración. Consulte Output Function and Plot Function Syntax para ver más detalles y la sintaxis.
Este ejemplo utiliza el enfoque basado en solvers para las funciones de salida. Para el enfoque basado en problemas, consulte Output Function for Problem-Based Optimization.
Por lo general, los solvers que utilizan una función de salida pueden tomar funciones no lineales como entradas. Puede determinar qué solvers pueden usar una función de salida consultando la sección de opciones de las páginas de referencia de la función.
Utilizar una función de salida
Este ejemplo muestra cómo utilizar una función de salida para monitorizar el proceso de resolución de fmincon
para resolver un problema de optimización no lineal restringido. Al final de cada iteración de fmincon
, la función de salida hace lo siguiente:
Representar el punto actual.
Almacenar el punto actual y el valor de la función objetivo correspondiente en una variable llamada
history
y almacenar la dirección de búsqueda actual en una variable llamadasearchdir
. La dirección de búsqueda es un vector que señala en la dirección desde el punto actual hasta el siguiente.
Además, para hacer que el historial esté disponible fuera de la función fmincon
, realice la optimización dentro de una función anidada que llame a fmincon
y devuelva las variables de la función de salida. Para obtener más información sobre este método de pasar información, consulte Pasar parámetros adicionales. La función auxiliar runfmincon
al final de este ejemplo contiene la llamada a la función anidada.
Función objetivo y función de restricción
El problema consiste en minimizar la función
sujeta a restricciones de desigualdad no lineal
La función objfun
anidada en runfmincon
implementa la función objetivo. La función confun
anidada en runfmincon
implementa la función de restricción.
Llamar a un solver
Para obtener la solución al problema y consultar el historial de las iteraciones de fmincon
, llame a la función runfmincon
.
[xsol,fval,history,searchdir] = runfmincon;
Max Line search Directional First-order Iter F-count f(x) constraint steplength derivative optimality Procedure 0 3 1.8394 0.5 Infeasible start point 1 6 1.85127 -0.09197 1 0.109 0.778 2 9 0.300167 9.33 1 -0.117 0.313 Hessian modified twice 3 12 0.529835 0.9209 1 0.12 0.232 4 16 0.186965 -1.517 0.5 -0.224 0.13 5 19 0.0729085 0.3313 1 -0.121 0.054 6 22 0.0353323 -0.03303 1 -0.0542 0.0271 7 25 0.0235566 0.003184 1 -0.0271 0.00587 8 28 0.0235504 9.031e-08 1 -0.0146 8.51e-07 Active inequalities (to within options.ConstraintTolerance = 1e-06): lower upper ineqlin ineqnonlin 1 2
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
La función de salida crea una gráfica de los puntos evaluados por fmincon
. Cada punto está etiquetado con su número de iteración. El punto óptimo se produce en la octava iteración. Los dos últimos puntos en la secuencia están tan cerca que se solapan.
La salida history
es una estructura que contiene dos campos.
disp(history)
x: [9x2 double] fval: [9x1 double]
El campo fval
en history
contiene los valores de la función objetivo correspondientes a la secuencia de puntos que fmincon
calcula.
disp(history.fval)
1.8394 1.8513 0.3002 0.5298 0.1870 0.0729 0.0353 0.0236 0.0236
Estos mismos valores se muestran en la salida iterativa en la columna con el encabezado f(x)
.
El campo x
de history
contiene la secuencia de puntos que fmincon
calcula.
disp(history.x)
-1.0000 1.0000 -1.3679 1.2500 -5.5708 3.4699 -4.8000 2.2752 -6.7054 1.2618 -8.0679 1.0186 -9.0230 1.0532 -9.5471 1.0471 -9.5474 1.0474
La salida searchdir
contiene las direcciones de búsqueda para fmincon
en cada iteración. La dirección de búsqueda es un vector que señala en la dirección desde el punto calculado en la iteración actual hasta el punto calculado en la siguiente iteración.
disp(searchdir)
-0.3679 0.2500 -4.2029 2.2199 0.7708 -1.1947 -3.8108 -2.0268 -1.3625 -0.2432 -0.9552 0.0346 -0.5241 -0.0061 -0.0003 0.0003
Funciones auxiliares
El siguiente código crea la función runfmincon
, que contiene la función de salida outfun
, la función objetivo objfun
y la función restringida no lineal confun
como funciones anidadas.
function [xsol,fval,history,searchdir] = runfmincon % Set up shared variables with outfun history.x = []; history.fval = []; searchdir = []; % Call optimization x0 = [-1 1]; options = optimoptions(@fmincon,'OutputFcn',@outfun,... 'Display','iter','Algorithm','active-set'); [xsol,fval] = fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options); function stop = outfun(x,optimValues,state) stop = false; switch state case 'init' hold on case 'iter' % Concatenate current point and objective function % value with history. x must be a row vector. history.fval = [history.fval; optimValues.fval]; history.x = [history.x; x]; % Concatenate current search direction with % searchdir. searchdir = [searchdir;... optimValues.searchdirection']; plot(x(1),x(2),'o'); % Label points with iteration number and add title. % Add .15 to x(1) to separate label from plotted 'o'. text(x(1)+.15,x(2),... num2str(optimValues.iteration)); title('Sequence of Points Computed by fmincon'); case 'done' hold off otherwise end end function f = objfun(x) f = exp(x(1))*(4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) +... 2*x(2) + 1); end function [c, ceq] = confun(x) % Nonlinear inequality constraints c = [1.5 + x(1)*x(2) - x(1) - x(2); -x(1)*x(2) - 10]; % Nonlinear equality constraints ceq = []; end end