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.

Funciones de salida

¿Qué es una función de salida?

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

Ejemplo: uso de funciones de salida

Lo que el ejemplo contiene

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.historysearchdir 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

Escribir la función de salida

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.optionsoutfun

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.outfunMATLAB®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

Escribir el archivo de función de ejemplo

Para crear el archivo de función para este ejemplo:

  1. Abra un nuevo archivo en el editor.MATLAB

  2. 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
  3. Guarde el archivo como en una carpeta en la ruta de acceso.runfmincon.mMATLAB

Ejecutar el ejemplo

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:fvalfmincon

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:xhistory

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.searchdirfmincon 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

Temas relacionados