Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

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 Sintaxis de función de salida y función de gráfica 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 llamada searchdir. 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

f(x)=exp(x1)(4x12+2x22+4x1x2+2x2+1)

sujeta a restricciones de desigualdad no lineal

x1+x2-x1x23/2x1x2-10.

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.

Figure contains an axes object. The axes object with title Sequence of Points Computed by fmincon contains 18 objects of type line, text. One or more of the lines displays its values using only markers

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

Temas relacionados