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.

Resuelva un problema no lineal restringido, basado en problemas

Problema de optimización típico

En este ejemplo se muestra cómo resolver un problema de optimización no lineal restringido mediante el enfoque basado en problemas. En el ejemplo se muestra el flujo de trabajo típico: crear una función objetiva, crear restricciones, resolver el problema y examinar los resultados.

Note:

Para todas las expresiones menos polinómicas o racionales, debe convertir sus funciones no lineales utilizando ver la última parte de este ejemplo, "formulación alternativa usando", o.fcn2optimexpr.fcn2optimexprConvertir función no lineal a expresión de optimización

Para conocer el enfoque basado en el solucionador de este problema, consulte.Resuelva un problema no lineal restringido, basado en Solver

Formulación del problema: función de Rosenbrock

Consideremos el problema de minimizar la función de Rosenbrock

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>1</mn>
<mn>0</mn>
<mn>0</mn>
<msup>
<mrow>
<mo>(</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
<mo>-</mo>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<mo>)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>+</mo>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>-</mo>
<msub>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>,</mo>
</mrow>
</math>

sobre el, es decir, el disco de radio 1 centrado en el origen. En otras palabras, encuentreunit disk

<math display="block">
<mrow>
<mi>x</mi>
</mrow>
</math>
que minimiza la función
<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">)</mo>
</mrow>
</math>
sobre el conjunto
<math display="block">
<mrow>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<mo>+</mo>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<mo></mo>
<mn>1</mn>
</mrow>
</math>
. Este problema es una minimización de una función no lineal sujeta a una restricción no lineal.

La función de Rosenbrock es una función de prueba estándar en la optimización. Tiene un valor mínimo único de 0 alcanzado en el punto.[1,1] Encontrar el mínimo es un desafío para algunos algoritmos porque la función tiene un mínimo superficial dentro de un valle profundamente curvado. La solución para este problema no está en el punto porque ese punto no satisface la restricción.[1,1]

Esta figura muestra dos vistas de la función de Rosenbrock en el disco de la unidad. El eje vertical se escala logaritmo; en otras palabras, la trama muestra

<math display="block">
<mrow>
<mi mathvariant="normal">log</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>+</mo>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">)</mo>
</mrow>
</math>
. Las líneas de contorno se encuentran debajo del diagrama de superficie.

rosenbrock = @(x)100*(x(:,2) - x(:,1).^2).^2 + (1 - x(:,1)).^2; % Vectorized function  figure1 = figure('Position',[1 200 600 300]); colormap('gray'); axis square; R = 0:.002:1; TH = 2*pi*(0:.002:1);  X = R'*cos(TH); Y = R'*sin(TH);  Z = log(1 + rosenbrock([X(:),Y(:)])); Z = reshape(Z,size(X));  % Create subplot subplot1 = subplot(1,2,1,'Parent',figure1); view([124 34]); grid('on'); hold on;  % Create surface surf(X,Y,Z,'Parent',subplot1,'LineStyle','none');  % Create contour contour(X,Y,Z,'Parent',subplot1);  % Create subplot subplot2 = subplot(1,2,2,'Parent',figure1); view([234 34]); grid('on'); hold on  % Create surface surf(X,Y,Z,'Parent',subplot2,'LineStyle','none');  % Create contour contour(X,Y,Z,'Parent',subplot2);  % Create textarrow annotation(figure1,'textarrow',[0.4 0.31],...     [0.055 0.16],...     'String',{'Minimum at (0.7864,0.6177)'});  % Create arrow annotation(figure1,'arrow',[0.59 0.62],...     [0.065 0.34]);  title("Rosenbrock's Function: Two Views")  hold off

El manejador de la función calcula la función de Rosenbrock en cualquier número de puntos 2-D a la vez.rosenbrock Esto acelera el trazado de la función y puede ser útil en otros contextos para evaluar la velocidad de una función en varios puntos.Vectorización (MATLAB)

La función

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">)</mo>
</mrow>
</math>
se llama la función objetivo es la función que desea minimizar.objective function. La desigualdad
<math display="block">
<mrow>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<mo>+</mo>
<msubsup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msubsup>
<mo></mo>
<mn>1</mn>
</mrow>
</math>
se denomina restricciones limitan el conjunto deconstraint.
<math display="block">
<mrow>
<mi>x</mi>
</mrow>
</math>
sobre el que un solucionador busca un mínimo. Puede tener cualquier número de restricciones, que son desigualdades o ecuaciones.

Definir problema mediante variables de optimización

El enfoque basado en problemas de optimización utiliza variables de optimización para definir objetivos y restricciones. Existen dos enfoques para crear expresiones utilizando estas variables:

  • Para funciones polinómicas o racionales, escriba expresiones directamente en las variables.

  • Para otros tipos de funciones, convierta las funciones en expresiones de optimización mediante.fcn2optimexpr VerAlternative Formulation Using fcn2optimexpr al final de este ejemplo.

Para este problema, tanto la función objetiva como la restricción no lineal son polinomios, por lo que puede escribir las expresiones directamente en términos de variables de optimización. Cree una variable de optimización 2-D nombrada.'x'

x = optimvar('x',1,2);

Cree la función objetiva como un polinomio en la variable de optimización.

obj = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;

Cree un problema de optimización denominado teniendo como función objetiva.probobj

prob = optimproblem('Objective',obj);

Cree la restricción no lineal como un polinomio en la variable de optimización.

nlcons = x(1)^2 + x(2)^2 <= 1;

Incluya la restricción no lineal en el problema.

prob.Constraints.circlecons = nlcons;

Revisa el problema.

showproblem(prob)
  OptimizationProblem :    minimize :        ((100 .* (x(2) - x(1).^2).^2) + (1 - x(1)).^2)   subject to circlecons:        (x(1).^2 + x(2).^2) <= 1       

Resuelve el problema

Para resolver el problema de optimización, llame.solve El problema necesita un punto inicial, que es una estructura que da el valor inicial de la variable de optimización. Cree la estructura de puntos inicial con unax0

<math display="block">
<mrow>
<mi>x</mi>
</mrow>
</math>
-valor de.[0 0]

x0.x = [0 0]; [sol,fval,exitflag,output] = solve(prob,x0)
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: [0.7864 0.6177]

fval = 0.0457 
exitflag =      OptimalSolution  
output = struct with fields:
         iterations: 24
          funcCount: 84
    constrviolation: 0
           stepsize: 6.9162e-06
          algorithm: 'interior-point'
      firstorderopt: 2.4373e-08
       cgiterations: 4
            message: '...'
             solver: 'fmincon'

Examine la solución

La solución muestra.exitflag = OptimalSolution Esta marca de salida indica que la solución es un óptimo local. Para obtener información sobre cómo tratar de encontrar una solución mejor, consulte.Cuando el Solver se ejecuta correctamente

El mensaje de salida indica que la solución satisface las restricciones. Puede comprobar que la solución es de hecho factible de varias maneras.

  • Compruebe la inviabilidad reportada en el campo de la estructura.constrviolationoutput

infeas = output.constrviolation
infeas = 0 

Una inviabilidad de 0 indica que la solución es factible.

  • Calcule la inviabilidad de la solución.

infeas = infeasibility(nlcons,sol)
infeas = 0 

Una vez más, una inviabilidad de 0 indica que la solución es factible.

  • Calcule la norma para asegurarse de que es menor o igual que 1.x

nx = norm(sol.x)
nx = 1.0000 

La estructura proporciona más información sobre el proceso de solución, como el número de iteraciones (24), el solucionador () y el número de evaluaciones de función (84).outputfmincon Para obtener más información sobre estas estadísticas, consulte.Tolerancias y criterios de detención

Formulación alternativa mediantefcn2optimexpr

Para expresiones más complejas, escriba archivos de función para las funciones de objetivo o restricción y conviértelos en expresiones de optimización mediante.fcn2optimexpr Por ejemplo, la base de la función de restricción no lineal está en el archivo:disk.m

type disk
function radsqr = disk(x)   radsqr = x(1)^2 + x(2)^2; 

Convierta este archivo de función en una expresión de optimización.

radsqexpr = fcn2optimexpr(@disk,x);

Además, también puede convertir el identificador de función, que se definió al principio de la rutina de trazado, en una expresión de optimización.rosenbrock

rosenexpr = fcn2optimexpr(rosenbrock,x);

Cree un problema de optimización mediante estas expresiones de optimización convertidas.

convprob = optimproblem('Objective',rosenexpr,'Constraints',radsqexpr <= 1);

Vea el nuevo problema.

showproblem(convprob)
  OptimizationProblem :    minimize :        anonymousFunction2(x)         where:           anonymousFunction2 = @(x)100*(x(:,2)-x(:,1).^2).^2+(1-x(:,1)).^2;   subject to :        disk(x) <= 1       

Resuelve el nuevo problema. La solución es la misma que antes.

[sol,fval,exitflag,output] = solve(convprob,x0)
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: [0.7864 0.6177]

fval = 0.0457 
exitflag =      OptimalSolution  
output = struct with fields:
         iterations: 24
          funcCount: 84
    constrviolation: 0
           stepsize: 6.9162e-06
          algorithm: 'interior-point'
      firstorderopt: 2.4373e-08
       cgiterations: 4
            message: '...'
             solver: 'fmincon'

Temas relacionados