Problema no lineal restringido utilizando la tarea Optimize de Live Editor o el solver
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
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 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
La función f(x) se llama función objetivo. La función objetivo es la función que desea minimizar. La desigualdad 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.
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.
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.
Elija la tarea basada en solvers.
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
.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.
En la sección Select problem data de la tarea, seleccione Objective function > objectiveFcn.
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];
Ejecute la sección pulsando Ctrl+Intro. Esta acción coloca
x0
en el espacio de trabajo.En la sección Select problem data de la tarea, seleccione Initial point (x0) > x0.
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.
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
En la sección Select problem data, seleccione
unitdisk
como la función de restricción.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.
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.
El área de salida muestra una tabla de iteraciones que se aborda en Interpretar el resultado.
Para encontrar la solución, fíjese en la parte superior de la tarea.
El solver coloca las variables
solution
yobjectiveValue
en el área de trabajo. Visualice sus valores insertando un salto de sección nueva debajo de la tarea e introduciendo estas líneas.Ejecute la sección pulsando Ctrl+Intro.
Para comprender el proceso de
fmincon
para obtener el resultado, consulte Interpretar el resultado.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.
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:
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.
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.
En la línea de comandos, introduzca:
edit rosenbrock
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;
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 no está en el formato que el solver puede utilizar. Para tener la sintaxis correcta, reformule la restricción como .
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.
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 = [ ];
Guarde el archivo
unitdisk.m
.Cree identificadores de función para las funciones objetivo y de restricción. Estos identificadores de función apuntan a las funciones y sirven para que el solver acceda a ellas.
fun = @rosenbrock; nonlcon = @unitdisk;
Ahora que ya ha definido las funciones objetivo y de restricción, cree las otras entradas de fmincon
.
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');
Cree el punto inicial.
x0 = [0 0];
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
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 Mensajes de salida aumentados.
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 unF-count
de 84, lo que indica quefmincon
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ónunitdisk
en cada iteración en la que la restricción es positiva. Puesto que el valor deunitdisk
fue negativo en todas las iteraciones, todas las iteraciones satisficieron la restricción.
Las otras columnas de la tabla de iteraciones se describen en Visualización iterativa.
Consulte también
Temas relacionados
- Resolver un problema no lineal restringido, basado problemas
- En primer lugar, elija el enfoque basado en problemas o el enfoque basado en solvers
- Introducción a la tarea Optimize basada en solvers de Live Editor
- Use Solver-Based Optimize Live Editor Task Effectively
- Configuración de problema de optimización basada en solvers
- Cómo utilizar la tarea Optimize de Live Editor