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.

Resolver un problema no lineal restringido basado en solvers

Problema de optimización típico

Este ejemplo muestra cómo resolver un problema no lineal restringido utilizando un solver Optimization Toolbox™. Este ejemplo demuestra el flujo de trabajo típico: crear una función objetivo, crear restricciones, resolver el problema y examinar los resultados.

Este ejemplo proporciona dos enfoques para resolver el problema. Uno utiliza la tarea Optimize de Live Editor, un enfoque visual. El otro utiliza la línea de comandos de MATLAB®, un enfoque basado en texto. También puede resolver este tipo de problema utilizando el enfoque basado en problemas; consulte Resolver un problema no lineal restringido, basado problemas.

Formulación del problema: función de Rosenbrock

El problema consiste en minimizar la función de Rosenbrock

f(x)=100(x2x12)2+(1x1)2,

sobre el disco unidad, es decir, el disco de radio 1 centrado en el origen. En otras palabras, encontrar x que minimiza la función f(x) sobre el x12+x221 establecido. Este problema es una minimización de una función no lineal con una restricción no lineal.

Nota

La función de Rosenbrock es una función de prueba estándar de optimización. Tiene un valor mínimo único de 0 alcanzado en el punto [1,1]. Encontrar el mínimo es un reto para algunos algoritmos, ya que la función tiene un mínimo superficial dentro de un valle con muchas curvas. La solución para este problema no se encuentra en el punto [1,1], ya que ese punto no satisface la restricción.

Esta figura muestra dos vistas de la función de Rosenbrock en el disco unidad. El eje vertical está en escala logarítmica, es decir, que la gráfica muestra log(1+f(x)). Las líneas de contorno quedan debajo de la gráfica de superficie.

Función de Rosenbrock en escala logarítmica: dos vistas

The Rosenbrock's function surface plot is steep and has a curve. The underlying level curves are somewhat parabolic.

 Código para generar la figura

La función f(x) se llama función objetivo. La función objetivo es la función que desea minimizar. La desigualdad x12+x221 se llama restricción. Las restricciones limitan el conjunto de x sobre el que un solver busca un mínimo. Puede tener cualquier número de restricciones, que son desigualdades o igualdades.

Todas las funciones de optimización de Optimization Toolbox minimizan una función objetivo. Para maximizar una función f, aplique una rutina de optimización para minimizar –f. Para obtener más detalles sobre la maximización, consulte Maximizar un objetivo.

Definir y resolver un problema utilizando la tarea Optimize de Live Editor

La tarea Optimize de Live Editor permite establecer y resolver el problema utilizando un enfoque visual.

  1. Cree un script en vivo nuevo haciendo clic en el botón New Live Script de la sección File de la pestaña Home.

    New Live Script button

  2. Inserte una tarea Optimize de Live Editor. Haga clic en la pestaña Insert y, después, en la sección Code, seleccione Task > Optimize.

    Optimize Live Editor task

  3. En la sección Specify problem type de la tarea, seleccione Objective > Nonlinear y Constraints > Nonlinear. Esta tarea selecciona el solver fmincon - Constrained nonlinear minimization.

  4. Incluya la función de Rosenbrock como la función objetivo. En la sección Select problem data de la tarea, seleccione Objective function > Local function y, después, haga clic en el botón New.... Aparece una función local nueva en una sección debajo de la tarea.

    function f = objectiveFcn(optimInput)
    % Example:
    % Minimize Rosenbrock's function
    % f = 100*(y - x^2)^2 + (1 - x)^2
    
    % Edit the lines below with your calculation
    x = optimInput(1);
    y = optimInput(2);
    f = 100*(y - x^2)^2 + (1 - x)^2;
    end

    Esta función implementa la función de Rosenbrock.

  5. En la sección Select problem data de la tarea, seleccione Objective function > objectiveFcn.

  6. Coloque el punto inicial x0 = [0;0] en el espacio de trabajo de MATLAB. Inserte una sección nueva encima de la tarea Optimize haciendo clic en la tarea y, después, haciendo clic en el botón Section Break de la pestaña Insert. En la nueva sección encima de la tarea, introduzca el siguiente código para el punto inicial.

    x0 = [0;0];
  7. Ejecute la sección pulsando Ctrl+Intro. Esta acción coloca x0 en el espacio de trabajo.

  8. En la sección Select problem data de la tarea, seleccione Initial point (x0) > x0.

    Objective function and x0

  9. En la sección Select problem data, seleccione Constraints > Nonlinear > Local function y, después, haga clic en el botón New.... Aparece una función local nueva debajo de la función local anterior.

  10. Edite la función local nueva de la siguiente manera.

    function [c,ceq] = unitdisk(x)
    c = x(1)^2 + x(2)^2 - 1;
    ceq = [ ];
    end
  11. En la sección Select problem data, seleccione unitdisk como la función de restricción.

    Problem data: objective, initial point, nonlinear constraint

  12. Para monitorizar el progreso del solver, en la sección Text display > Each iteration de la tarea, seleccione Display progress. Asimismo, seleccione Objective value and feasibility para la gráfica.

    Iterative display and Objective value and feasibility plot function

  13. Para ejecutar el solver, haga clic en el botón de opciones situado en la parte superior derecha de la ventana de la tarea y seleccione Run Section. La gráfica aparece en una ventana de figura separada y en el área de salida.

    Function values generally decrease as iterations proceed

    El área de salida muestra una tabla de iteraciones que se aborda en Interpretar el resultado.

  14. Para encontrar la solución, fíjese en la parte superior de la tarea.

    solution, objectiveValue are returned from fmincon

    El solver coloca las variables solution y objectiveValue en el área de trabajo. Visualice sus valores insertando un salto de sección nueva debajo de la tarea e introduciendo estas líneas.

    disp(solution); disp(objectiveValue)

  15. Ejecute la sección pulsando Ctrl+Intro.

    solution = [0.7864,0.6177]. objectiveValue = 0.0457.

    Para comprender el proceso de fmincon para obtener el resultado, consulte Interpretar el resultado.

  16. Para mostrar el código que genera Optimize para resolver el problema, haga clic en el botón de opciones situado en la parte superior derecha de la ventana de la tarea y seleccione Controls and Code.

    Controls and Code

    Aparece el siguiente código en la parte inferior de la tarea.

    % Set nondefault solver options
    options = optimoptions('fmincon','Display','iter','PlotFcn',...
        'optimplotfvalconstr');
    
    % Solve
    [solution,objectiveValue] = fmincon(@objectiveFcn,x0,[],[],[],[],[],[],...
        @unitdisk,options);

    Este código es el código que se utiliza para resolver el problema en la línea de comandos, como se describe a continuación.

Definir y resolver un problema en la línea de comandos

El primer paso para resolver un problema de optimización en la línea de comandos consiste en elegir un solver. Consulte la Tabla de decisiones de optimización. En un problema con una función objetivo no lineal y una restricción no lineal, por lo general se utiliza el solver fmincon.

Consulte la página de referencia de la función fmincon. La sintaxis del solver es la siguiente.

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

Las entradas fun y nonlcon representan la función objetivo y las funciones de restricción no lineales, respectivamente.

Exprese el problema de la siguiente manera:

  1. Defina la función objetivo en el lenguaje de MATLAB como un archivo de función o como una función anónima. Este ejemplo utiliza un archivo de función.

  2. Defina las restricciones como un archivo separado o una función anónima.

Un archivo de función es un archivo de texto que contiene comandos de MATLAB y que tiene la extensión .m. Cree un archivo de función en cualquier editor de texto o utilice el editor de MATLAB integrado como en este ejemplo.

  1. En la línea de comandos, introduzca:

    edit rosenbrock
  2. En el editor de MATLAB, introduzca:

    %% ROSENBROCK(x) expects a two-column matrix and returns a column vector
    % The output is the Rosenbrock function, which has a minimum at
    % (1,1) of value 0, and is strictly positive everywhere else.
    
    function f = rosenbrock(x)
    
    f = 100*(x(:,2) - x(:,1).^2).^2 + (1 - x(:,1)).^2;

    Nota

    rosenbrock es una función vectorizada que puede calcular valores para varios puntos al mismo tiempo. Consulte Vectorización. Una función vectorizada es la mejor para representar. Para obtener una versión no vectorizada, introduzca:

    %% ROSENBROCK1(x) expects a two-element vector and returns a scalar
    % The output is the Rosenbrock function, which has a minimum at
    % (1,1) of value 0, and is strictly positive everywhere else.
    
    function f = rosenbrock1(x)
    
    f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
  3. Guarde el archivo con el nombre rosenbrock.m.

Las funciones de restricción tienen el formato c(x) ≤ 0 o ceq(x) = 0.. La restricción x12+x221 no está en el formato que el solver puede utilizar. Para tener la sintaxis correcta, reformule la restricción como x12+x2210.

La sintaxis para restricciones no lineales devuelve tanto restricciones de igualdad como de desigualdad. Este ejemplo solo incluye una restricción de desigualdad, por lo que debe pasar un arreglo vacío [] como la función de restricción de igualdad ceq.

Escriba un archivo de función para la restricción no lineal teniendo en cuenta estas consideraciones.

  1. Cree un archivo llamado unitdisk.m que contenga el siguiente código:

    function [c,ceq] = unitdisk(x)
    c = x(1)^2 + x(2)^2 - 1;
    ceq = [ ];
  2. Guarde el archivo unitdisk.m.

Ahora que ya ha definido las funciones objetivo y de restricción, cree las otras entradas de fmincon.

  1. Cree opciones para que fmincon utilice la función de gráfica 'optimplotfvalconstr' y devuelva una visualización iterativa.

    options = optimoptions('fmincon',...
        'PlotFcn','optimplotfvalconstr',...
        'Display','iter');
  2. Cree el punto inicial.

    x0 = [0 0];
  3. Cree entradas vacías para las restricciones que este ejemplo no utiliza.

    A = [];
    b = [];
    Aeq = [];
    beq = [];
    lb = [];
    ub = [];

Resuelva el problema llamando a fmincon.

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0       3    1.000000e+00    0.000e+00    2.000e+00
    1      13    7.753537e-01    0.000e+00    6.250e+00    1.768e-01
    2      18    6.519648e-01    0.000e+00    9.048e+00    1.679e-01
    3      21    5.543209e-01    0.000e+00    8.033e+00    1.203e-01
    4      24    2.985207e-01    0.000e+00    1.790e+00    9.328e-02
    5      27    2.653799e-01    0.000e+00    2.788e+00    5.723e-02
    6      30    1.897216e-01    0.000e+00    2.311e+00    1.147e-01
    7      33    1.513701e-01    0.000e+00    9.706e-01    5.764e-02
    8      36    1.153330e-01    0.000e+00    1.127e+00    8.169e-02
    9      39    1.198058e-01    0.000e+00    1.000e-01    1.522e-02
   10      42    8.910052e-02    0.000e+00    8.378e-01    8.301e-02
   11      45    6.771960e-02    0.000e+00    1.365e+00    7.149e-02
   12      48    6.437664e-02    0.000e+00    1.146e-01    5.701e-03
   13      51    6.329037e-02    0.000e+00    1.883e-02    3.774e-03
   14      54    5.161934e-02    0.000e+00    3.016e-01    4.464e-02
   15      57    4.964194e-02    0.000e+00    7.913e-02    7.894e-03
   16      60    4.955404e-02    0.000e+00    5.462e-03    4.185e-04
   17      63    4.954839e-02    0.000e+00    3.993e-03    2.208e-05
   18      66    4.658289e-02    0.000e+00    1.318e-02    1.255e-02
   19      69    4.647011e-02    0.000e+00    8.006e-04    4.940e-04
   20      72    4.569141e-02    0.000e+00    3.136e-03    3.379e-03
   21      75    4.568281e-02    0.000e+00    6.440e-05    3.974e-05
   22      78    4.568281e-02    0.000e+00    8.000e-06    1.084e-07
   23      81    4.567641e-02    0.000e+00    1.601e-06    2.793e-05
   24      84    4.567482e-02    0.000e+00    2.023e-08    6.916e-06

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.

x =

    0.7864    0.6177


fval =

    0.0457

Function values generally decrease as iterations proceed

El mensaje de salida dice que la búsqueda de un óptimo restringido terminó porque la derivada de la función objetivo es casi 0 en las direcciones que permite la restricción y que la restricción se ha satisfecho con la precisión necesaria. Varias frases del mensaje contienen enlaces a más información sobre los términos utilizados en el mensaje. Para obtener más detalles sobre estos enlaces, consulte Enhanced Exit Messages.

Interpretar el resultado

La tabla de iteraciones, tanto en el área de salida de la tarea de Live Editor como en la ventana de comandos de MATLAB, muestra cómo buscó MATLAB el valor mínimo de la función de Rosenbrock en el disco unidad. La tabla puede diferir según la versión de toolbox y la plataforma de cálculo. La siguiente descripción se aplica a la tabla que se muestra en este ejemplo.

  • La primera columna, con la etiqueta Iter, es el número de iteración de 0 a 24. fmincon necesitó 24 iteraciones para convergir.

  • La segunda columna, con la etiqueta F-count, informa del número acumulativo de veces que se evaluó la función de Rosenbrock. La fila final muestra un F-count de 84, lo que indica que fmincon evaluó la función de Rosenbrock 84 veces durante el proceso de búsqueda de un mínimo.

  • La tercera columna, con la etiqueta f(x), muestra el valor de la función objetivo. El valor final, 4.567482e-2, es el mínimo que se indica en la ejecución de Optimize y al final del mensaje de salida de la ventana de comandos.

  • La cuarta columna, Feasibility, es 0 para todas las iteraciones. Esta columna muestra el valor de la función de restricción unitdisk en cada iteración en la que la restricción es positiva. Puesto que el valor de unitdisk fue negativo en todas las iteraciones, todas las iteraciones satisficieron la restricción.

Las otras columnas de la tabla de iteraciones se describen en Iterative Display.

Consulte también

|

Temas relacionados