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.
Para algunos problemas, es posible que desee la salida de un algoritmo de optimización en cada iteración. Por ejemplo, es posible que desee buscar la secuencia de puntos que el algoritmo calcula y trazar esos puntos. Para ello, cree una función de salida a la que llama la función de optimización en cada iteración. Consulte los detalles y la sintaxis.Sintaxis de función de salida
En esta sección se muestra el enfoque basado en Solver para las funciones de salida. Para el enfoque basado en problemas, vea.Función de salida para la optimización basada en problemas
Generalmente, los solucionadores que pueden emplear una función de salida son aquellos que pueden tomar funciones no lineales como entradas. Puede determinar qué solucionadores pueden tener una función de salida buscando en la sección Opciones de las páginas de referencia de función, o comprobando si la opción está disponible en la aplicación de optimización para un solucionador.Output function
En el ejemplo siguiente se continúa el que está en, que llama a la función en la línea de comandos para resolver un problema de optimización no lineal, restringido.Restricciones de desigualdad no linealesfmincon
En el ejemplo de esta sección se usa un archivo de función para llamar.fmincon
El archivo también contiene todas las funciones necesarias para el ejemplo, incluyendo:
La función objetiva
La función de restricción
Una función de salida que registra el historial de puntos calculados por el algoritmo para.fmincon
En cada iteración del algoritmo para, la función de salida:fmincon
Traza el punto actual calculado por el algoritmo.
Almacena el punto y su valor de función objetivo correspondiente en una variable llamada, y almacena la dirección de búsqueda actual en una variable llamada.history
searchdir
La dirección de búsqueda es un vector que apunta en la dirección desde el punto actual hasta el siguiente.
El código del archivo está aquí:.Escribir el archivo de función de ejemplo
Especifique la función de salida, comooptions
options = optimoptions(@fmincon,'OutputFcn',@outfun)
donde está el nombre de la función de salida.outfun
Cuando se llama a una función de optimización con como entrada, la función de optimización llama en cada iteración de su algoritmo.options
outfun
En general, puede ser cualquier función, pero en este ejemplo, es una función anidada del archivo de función que se describe en.outfun
MATLAB®Escribir el archivo de función de ejemplo El código siguiente define la función de salida:
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. % Add .15 to x(1) to separate label from plotted 'o' text(x(1)+.15,x(2),num2str(optimValues.iteration)); case 'done' hold off otherwise end end
Consulte para obtener más información acerca de las funciones anidadas.Using Handles to Store Function Parameters
Los argumentos a los que pasa la función de optimización son:outfun
— El punto calculado por el algoritmo en la iteración actualx
— Estructura que contiene datos de la iteración actualoptimValues
El ejemplo utiliza los siguientes campos de:optimValues
— Número de la iteración actualoptimValues.iteration
— Valor actual de la función objetivaoptimValues.fval
— Dirección de búsqueda actualoptimValues.searchdirection
— El estado actual del algoritmo (,,, o)state
'init'
'interrupt'
'iter'
'done'
Para obtener más información acerca de estos argumentos, consulte.Sintaxis de función de salida
Para crear el archivo de función para este ejemplo:
Abra un nuevo archivo en el editor.MATLAB
Copie y pegue el siguiente código en el archivo:
function [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 = 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
Guarde el archivo como en una carpeta en la ruta de acceso.runfmincon.m
MATLAB
Para ejecutar el ejemplo, escriba:
[history searchdir] = runfmincon;
Esto muestra la siguiente salida iterativa en la ventana de comandos.
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 salida es una estructura que contiene dos campos:history
history = struct with fields: x: [9×2 double] fval: [9×1 double]
El campo contiene los valores de la función objetiva correspondientes a la secuencia de puntos calculada por:fval
fmincon
history.fval ans = 1.8394 1.8513 0.3002 0.5298 0.1870 0.0729 0.0353 0.0236 0.0236
Estos son los mismos valores mostrados en la salida iterativa en la columna con cabecera.f(x)
El campo contiene la secuencia de puntos calculada por el algoritmo:x
history
history.x ans = -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
Este ejemplo muestra una gráfica de esta secuencia de puntos, en la que cada punto se etiqueta por su número de iteración.
El punto óptimo se produce en la octava iteración. Tenga en cuenta que los dos últimos puntos de la secuencia están tan cerca que se superponen.
El segundo argumento de salida,, contiene las instrucciones de búsqueda para cada iteración.searchdir
fmincon
La dirección de búsqueda es un vector que apunta desde el punto calculado en la iteración actual hasta el punto calculado en la siguiente iteración:
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