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.

Función de salida para la optimización basada en problemas

En este ejemplo se muestra cómo utilizar una función de salida para trazar y almacenar el historial de las iteraciones para un problema no lineal. Este historial incluye los puntos evaluados, las direcciones de búsqueda que utiliza el solucionador para generar puntos y los valores de función objetiva en los puntos evaluados.

Para el enfoque basado en el solucionador de este ejemplo, vea.Funciones de salida

Las funciones de trazado tienen la misma sintaxis que las funciones de salida, por lo que este ejemplo también se aplica a las funciones de trazado.

Tanto para el enfoque basado en el solucionador como para el enfoque basado en problemas, escriba la función de salida como si estuviera utilizando el enfoque basado en el solucionador. En el enfoque basado en el solucionador, se utiliza una única variable vectorial, normalmente denotada, en lugar de una colección de variables de optimización de varios tamaños.x Por lo tanto, para escribir una función de salida para el enfoque basado en problemas, debe comprender la correspondencia entre las variables de optimización y el único solucionador basado en.x Para asignar entre variables de optimización y, utilice.xvarindex En este ejemplo, para evitar confusiones con una variable de optimización denominada, use "como nombre de variable vectorial.xin"

Descripción del problema

El problema es minimizar la siguiente función de variables y:xy

<math display="block">
<mrow>
<mi>f</mi>
<mo>=</mo>
<mi mathvariant="normal">exp</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">)</mo>
<mrow>
<mo>(</mo>
<mn>4</mn>
<msup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>+</mo>
<mn>2</mn>
<msup>
<mrow>
<mi>y</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>+</mo>
<mn>4</mn>
<mi>x</mi>
<mi>y</mi>
<mo>+</mo>
<mn>2</mn>
<mi>y</mi>
<mo>+</mo>
<mn>1</mn>
<mo>)</mo>
</mrow>
<mo>.</mo>
</mrow>
</math>

Además, el problema tiene dos restricciones no lineales:

<math display="block">
<mrow>
<mtable columnalign="left">
<mtr>
<mtd>
<mrow>
<mi>x</mi>
<mo>+</mo>
<mi>y</mi>
<mo>-</mo>
<mi>x</mi>
<mi>y</mi>
<mo></mo>
<mn>1</mn>
<mo>.</mo>
<mn>5</mn>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<mi>x</mi>
<mi>y</mi>
<mo></mo>
<mn>1</mn>
<mn>0</mn>
<mo>.</mo>
</mrow>
</mtd>
</mtr>
</mtable>
</mrow>
</math>

Configuración basada en problemas

Para configurar el problema en el enfoque basado en problemas, defina las variables de optimización y un objeto de problema de optimización.

x = optimvar('x'); y = optimvar('y'); prob = optimproblem;

La función objetivo está en el archivo.objfun.m

type objfun
function f = objfun(x,y) %OBJFUN Objective function. % Documentation example.  %   Copyright 2018 The MathWorks, Inc.  f = exp(x) * (4*x^2 + 2*y^2 + 4*x*y + 2*y + 1); 

Esta expresión no es una función racional de sus variables. Por lo tanto, para incluirlo en el objetivo, primero convierta la función a una expresión de optimización utilizando.fcn2optimexpr

prob.Objective = fcn2optimexpr(@objfun,x,y);

Para incluir las restricciones no lineales, cree expresiones de restricción de optimización.

cons1 = x + y - x*y >= 1.5; cons2 = x*y >= -10; prob.Constraints.cons1 = cons1; prob.Constraints.cons2 = cons2;

Dado que se trata de un problema no lineal, debe incluir una estructura de puntos inicial.x0 Usa y.x0.x = –1x0.y = 1

x0.x = -1; x0.y = 1;

Función de salida

La función de salida registra un historial de los puntos generados por sus iteraciones.outfunfmincon La función de salida también traza los puntos y mantiene un historial separado de las direcciones de búsqueda para el algoritmo.sqp La dirección de búsqueda es un vector desde el punto anterior hasta el siguiente punto que intenta.fmincon Durante su paso final, la función de salida guarda el historial en las variables del espacio de trabajo y guarda un historial de los valores de la función objetiva en cada paso iterativo.

Para obtener la sintaxis necesaria de las funciones de salida de optimización, consulte.Sintaxis de función de salida

Una función de salida toma una única variable vectorial como entrada. Pero el problema actual tiene dos variables. Para encontrar la asignación entre las variables de optimización y la variable de entrada, utilice.varindex

idx = varindex(prob); idx.x
ans = 1 
idx.y
ans = 2 

La asignación muestra que es la variable 1 y es la variable 2.xy Por lo tanto, si la variable de entrada se nombra, entonces y.inx = in(1)y = in(2)

type outfun
function stop = outfun(in,optimValues,state,idx)      persistent history searchdir fhistory      stop = false;        switch state          case 'init'              hold on              history = [];              fhistory = [];              searchdir = [];          case 'iter'          % Concatenate current point and objective function          % value with history. in must be a row vector.            fhistory = [fhistory; optimValues.fval];            history = [history; in(:)']; % Ensure in is a row vector          % Concatenate current search direction with           % searchdir.            searchdir = [searchdir;...                          optimValues.searchdirection(:)'];            plot(in(idx.x),in(idx.y),'o');          % Label points with iteration number and add title.          % Add .15 to idx.x to separate label from plotted 'o'            text(in(idx.x)+.15,in(idx.y),...                  num2str(optimValues.iteration));            title('Sequence of Points Computed by fmincon');          case 'done'              hold off              assignin('base','optimhistory',history);              assignin('base','searchdirhistory',searchdir);              assignin('base','functionhistory',fhistory);          otherwise      end  end 

Incluya la función de salida en la optimización estableciendo la opción.OutputFcn Además, establezca la opción para usar el algoritmo en lugar del algoritmo predeterminado.Algorithm'sqp''interior-point' Pase a la función de salida como un parámetro adicional en la última entrada.idx Ver.Pasar parámetros adicionales

outputfn = @(in,optimValues,state)outfun(in,optimValues,state,idx); opts = optimoptions('fmincon','Algorithm','sqp','OutputFcn',outputfn);

Ejecutar optimización mediante la función de salida

Ejecute la optimización, incluida la función de salida, mediante el argumento ' nombre-valor par.Options'

[sol,fval,eflag,output] = solve(prob,x0,'Options',opts)

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. 
sol = struct with fields:
    x: -9.5474
    y: 1.0474

fval = 0.0236 
eflag =      OptimalSolution  
output = struct with fields:
         iterations: 10
          funcCount: 34
          algorithm: 'sqp'
            message: '...'
    constrviolation: 0
           stepsize: 1.4788e-07
       lssteplength: 1
      firstorderopt: 8.0068e-10
             solver: 'fmincon'

Examine el historial de iteraciones. Cada fila de la matriz representa un punto.optimhistory Los últimos puntos están muy cerca, lo que explica por qué la secuencia trazada muestra los números sobreimpresos para los puntos 8, 9 y 10.

disp('Locations');disp(optimhistory)
Locations    -1.0000    1.0000    -1.3679    1.2500    -1.6509    1.1813    -3.5870    2.0537    -4.4574    2.2895    -5.8015    1.5531    -7.6498    1.1225    -8.5223    1.0572    -9.5463    1.0464    -9.5474    1.0474    -9.5474    1.0474 

Examine las matrices y.searchdirhistoryfunctionhistory

disp('Search Directions');disp(searchdirhistory)
Search Directions          0         0    -0.3679    0.2500    -0.2831   -0.0687    -1.9360    0.8725    -0.8704    0.2358    -1.3441   -0.7364    -2.0877   -0.6493    -0.8725   -0.0653    -1.0241   -0.0108    -0.0011    0.0010     0.0000   -0.0000 
disp('Function Values');disp(functionhistory)
Function Values     1.8394     1.8513     1.7757     0.9839     0.6343     0.3250     0.0978     0.0517     0.0236     0.0236     0.0236 

Consulte también

Temas relacionados