Main Content

fmincon

Encontrar el mínimo de una función multivariable no lineal restringida

Descripción

Solver de programación no lineal.

Encuentra el mínimo de un problema especificado por

minxf(x) such that {c(x)0ceq(x)=0AxbAeqx=beqlbxub,

b y beq son vectores, A y Aeq son matrices, c(x) y ceq(x) son funciones que devuelven matrices, y f(x) es una función que devuelve un escalar. f(x), c(x) y ceq(x) pueden ser funciones no lineales.

x, lb y ub se pueden pasar como vectores o matrices; consulte Argumentos de matriz.

ejemplo

x = fmincon(fun,x0,A,b) comienza en x0 e intenta encontrar un minimizador x de la función que se describe en fun sujeto a las desigualdades lineales A*x ≤ b. x0 puede ser un escalar, un vector o una matriz.

Nota

En Pasar parámetros adicionales se explica cómo pasar parámetros adicionales a la función objetivo y a las funciones de restricción no lineales, si fuera necesario.

ejemplo

x = fmincon(fun,x0,A,b,Aeq,beq) minimiza fun sujeto a las igualdades lineales Aeq*x = beq y A*x ≤ b. Si no existen desigualdades, establezca A = [] y b = [].

ejemplo

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) define un conjunto de límites inferiores y superiores en las variables de diseño de x, de modo que la solución siempre se encuentra en el rango lb x ub. Si no existen igualdades, establezca Aeq = [] y beq = []. Si x(i) está desacotado por abajo, establezca lb(i) = -Inf, y si x(i) está desacotado por arriba, establezca ub(i) = Inf.

Nota

Si los límites de entrada especificados para un problema son inconsistentes, fmincon genera un error. En este caso, la salida x es x0 y fval es [].

Para el algoritmo 'interior-point' predeterminado, fmincon establece los componentes de x0 que vulneran los límites lb ≤ x ≤ ub, o que equivalen a un límite en el interior de la región acotada. Para el algoritmo 'trust-region-reflective', fmincon establece los componentes vulneradores en el interior de la región acotada. Para los demás algoritmos, fmincon establece los componentes vulneradores en el límite más próximo. Los componentes que respetan los límites no se cambian. Consulte Las iteraciones pueden vulnerar las restricciones.

ejemplo

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) limita la minimización a las desigualdades no lineales c(x) o a las igualdades ceq(x) que se definen en nonlcon. fmincon optimiza de forma que c(x) ≤ 0 y ceq(x) = 0. Si no existen límites, establezca lb = [] y ub = [].

ejemplo

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) minimiza con las opciones de optimización especificadas en options. Utilice optimoptions para configurar estas opciones. Si no hay restricciones de igualdad o desigualdad no lineales, establezca nonlcon = [].

ejemplo

x = fmincon(problem) encuentra el mínimo para problem, una estructura descrita en problem.

ejemplo

[x,fval] = fmincon(___), para cualquier sintaxis, devuelve el valor de la función objetivo fun en la solución x.

ejemplo

[x,fval,exitflag,output] = fmincon(___), devuelve adicionalmente un valor exitflag que describe la condición de salida de fmincon y una estructura output con información sobre el proceso de optimización.

ejemplo

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___) devuelve adicionalmente:

  • lambda: estructura con campos que contienen los multiplicadores de Lagrange en la solución x.

  • grad: gradiente de fun en la solución x.

  • hessian: matriz hessiana de fun en la solución x. Consulte Matriz hessiana de fmincon.

Ejemplos

contraer todo

Encuentre el valor mínimo de la función de Rosenbrock cuando hay una restricción de desigualdad lineal.

Establezca la función objetivo fun en la función de Rosenbrock. Es bien sabido que la función de Rosenbrock es difícil de minimizar. Tiene su valor objetivo mínimo de 0 en el punto (1,1). Para obtener más información, consulte Problema no lineal restringido utilizando la tarea Optimize de Live Editor o el solver.

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

Encuentre el valor mínimo comenzando por el punto [-1,2], restringido para tener x(1)+2x(2)1. Exprese esta restricción con el formato Ax <= b tomando A = [1,2] y b = 1. Tenga en cuenta que esta restricción supone que la solución no sea la solución no restringida (1,1), porque en ese punto x(1)+2x(2)=3>1.

x0 = [-1,2];
A = [1,2];
b = 1;
x = fmincon(fun,x0,A,b)
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 = 1×2

    0.5022    0.2489

Encuentre el valor mínimo de la función de Rosenbrock cuando hay tanto una restricción de desigualdad lineal como una restricción de igualdad lineal.

Establezca la función objetivo fun en la función de Rosenbrock.

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

Encuentre el valor mínimo comenzando por el punto [0.5,0], restringido para tener x(1)+2x(2)1 y 2x(1)+x(2)=1.

  • Exprese la restricción de desigualdad lineal con el formato A*x <= b tomando A = [1,2] y b = 1.

  • Exprese la restricción de igualdad lineal con el formato Aeq*x = beq tomando Aeq = [2,1] y beq = 1.

x0 = [0.5,0];
A = [1,2];
b = 1;
Aeq = [2,1];
beq = 1;
x = fmincon(fun,x0,A,b,Aeq,beq)
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 = 1×2

    0.4149    0.1701

Encuentre el mínimo de una función objetivo con presencia de límites de restricción.

La función objetivo es una función algebraica simple de dos variables.

fun = @(x)1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));

Fíjese en la región en la que x tiene valores positivos, x(1) 1 y x(2) 2.

lb = [0,0];
ub = [1,2];

El problema no tiene restricciones lineales, así que establezca esos argumentos en [].

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

Pruebe un punto inicial en el medio de la región.

x0 = (lb + ub)/2;

Resuelva el problema.

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
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 = 1×2

    1.0000    2.0000

Un punto inicial distinto puede conllevar una solución distinta.

x0 = x0/5;
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
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 = 1×2
10-6 ×

    0.4000    0.4000

Para determinar qué solución es mejor, consulte Obtener el valor de la función objetivo.

Encuentre el mínimo de una función sujeta a restricciones no lineales

Encuentre el punto en el que la función de Rosenbrock se minimiza dentro de un círculo, también sujeto a límites de restricción.

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

Fíjese en la región $0 \le x(1) \le 0.5$, $0.2 \le x(2) \le 0.8$.

lb = [0,0.2];
ub = [0.5,0.8];

Fíjese también en el círculo centrado en [1/3,1/3] con radio 1/3. Copie el código siguiente en un archivo llamado circlecon.m en la ruta de MATLAB®.


% Copyright 2015 The MathWorks, Inc.

function [c,ceq] = circlecon(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];

No hay restricciones lineales, así que establezca esos argumentos en [].

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

Escoja un punto inicial que satisfaga todas las restricciones.

x0 = [1/4,1/4];

Resuelva el problema.

nonlcon = @circlecon;
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
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.5000    0.2500

Establezca opciones para ver las iteraciones según se produzcan y para utilizar un algoritmo diferente.

Para observar el proceso de resolución fmincon, establezca la opción Display en 'iter'. Pruebe también el algoritmo 'sqp', que en ocasiones es más rápido o más preciso que el algoritmo 'interior-point' predeterminado.

options = optimoptions('fmincon','Display','iter','Algorithm','sqp');

Encuentre el mínimo de la función de Rosenbrock en el disco de la unidad, ||x||21. Cree primero una función que represente la restricción no lineal. Guárdela como un archivo llamado unitdisk.m en la ruta de MATLAB®.

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

Cree las especificaciones de problema restantes. Después, ejecute fmincon.

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
nonlcon = @unitdisk;
x0 = [0,0];
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
 Iter  Func-count            Fval   Feasibility   Step Length       Norm of   First-order  
                                                                       step    optimality
    0           3    1.000000e+00     0.000e+00     1.000e+00     0.000e+00     2.000e+00  
    1          12    8.913011e-01     0.000e+00     1.176e-01     2.353e-01     1.107e+01  
    2          22    8.047847e-01     0.000e+00     8.235e-02     1.900e-01     1.330e+01  
    3          28    4.197517e-01     0.000e+00     3.430e-01     1.217e-01     6.172e+00  
    4          31    2.733703e-01     0.000e+00     1.000e+00     5.254e-02     5.705e-01  
    5          34    2.397111e-01     0.000e+00     1.000e+00     7.498e-02     3.164e+00  
    6          37    2.036002e-01     0.000e+00     1.000e+00     5.960e-02     3.106e+00  
    7          40    1.164353e-01     0.000e+00     1.000e+00     1.459e-01     1.059e+00  
    8          43    1.161753e-01     0.000e+00     1.000e+00     1.754e-01     7.383e+00  
    9          46    5.901601e-02     0.000e+00     1.000e+00     1.547e-02     7.278e-01  
   10          49    4.533081e-02     2.898e-03     1.000e+00     5.393e-02     1.252e-01  
   11          52    4.567454e-02     2.225e-06     1.000e+00     1.492e-03     1.679e-03  
   12          55    4.567481e-02     4.406e-12     1.000e+00     2.095e-06     1.501e-05  
   13          58    4.567481e-02     0.000e+00     1.000e+00     2.159e-09     1.511e-05  

Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    0.7864    0.6177

Para obtener detalles de la visualización iterativa, consulte Visualización iterativa.

Incluya una evaluación del gradiente en la función objetivo para obtener cálculos más rápidos o más fiables.

Incluya la evaluación del gradiente como salida condicionalizada en el archivo de función objetivo. Para obtener más detalles, consulte Incluir gradientes y matrices hessianas. La función objetivo es la función de Rosenbrock,

$$ f(x) = 100{\left( {{x_2} - x_1^2} \right)^2} +&#10;{(1 - {x_1})^2},$$

que tiene el gradiente

$$\nabla f(x) = \left[ {\begin{array}{*{20}{c}}&#10;{ - 400\left( {{x_2} - x_1^2} \right){x_1} - 2\left( {1 - {x_1}} \right)}\\&#10;{200\left( {{x_2} - x_1^2} \right)}&#10;\end{array}} \right].$$

function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1 % gradient required
    g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));
        200*(x(2)-x(1)^2)];
end

Guarde este código como un archivo llamado rosenbrockwithgrad.m en la ruta de MATLAB®.

Cree opciones para utilizar el gradiente de función objetivo.

options = optimoptions('fmincon','SpecifyObjectiveGradient',true);

Cree las otras entradas para el problema. Después, llame a fmincon.

fun = @rosenbrockwithgrad;
x0 = [-1,2];
A = [];
b = [];
Aeq = [];
beq = [];
lb = [-2,-2];
ub = [2,2];
nonlcon = [];
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
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 =

    1.0000    1.0000

Resuelva el mismo problema que en Opciones no predeterminadas utilizando una estructura de problema en lugar de argumentos separados.

Cree las opciones y una estructura de problema. Consulte en problem los nombres de campo y los campos necesarios.

options = optimoptions('fmincon','Display','iter','Algorithm','sqp');
problem.options = options;
problem.solver = 'fmincon';
problem.objective = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
problem.x0 = [0,0];

La función de restricción no lineal unitdisk aparece al final de este ejemplo. Incluya la función de restricción no lineal en problem.

problem.nonlcon = @unitdisk;

Resuelva el problema.

x = fmincon(problem)
 Iter  Func-count            Fval   Feasibility   Step Length       Norm of   First-order  
                                                                       step    optimality
    0           3    1.000000e+00     0.000e+00     1.000e+00     0.000e+00     2.000e+00  
    1          12    8.913011e-01     0.000e+00     1.176e-01     2.353e-01     1.107e+01  
    2          22    8.047847e-01     0.000e+00     8.235e-02     1.900e-01     1.330e+01  
    3          28    4.197517e-01     0.000e+00     3.430e-01     1.217e-01     6.172e+00  
    4          31    2.733703e-01     0.000e+00     1.000e+00     5.254e-02     5.705e-01  
    5          34    2.397111e-01     0.000e+00     1.000e+00     7.498e-02     3.164e+00  
    6          37    2.036002e-01     0.000e+00     1.000e+00     5.960e-02     3.106e+00  
    7          40    1.164353e-01     0.000e+00     1.000e+00     1.459e-01     1.059e+00  
    8          43    1.161753e-01     0.000e+00     1.000e+00     1.754e-01     7.383e+00  
    9          46    5.901601e-02     0.000e+00     1.000e+00     1.547e-02     7.278e-01  
   10          49    4.533081e-02     2.898e-03     1.000e+00     5.393e-02     1.252e-01  
   11          52    4.567454e-02     2.225e-06     1.000e+00     1.492e-03     1.679e-03  
   12          55    4.567481e-02     4.406e-12     1.000e+00     2.095e-06     1.501e-05  
   13          58    4.567481e-02     0.000e+00     1.000e+00     2.159e-09     1.511e-05  

Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    0.7864    0.6177

La visualización iterativa y la solución son las mismas que en Opciones no predeterminadas.

El siguiente código crea la función unitdisk.

function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [];
end

Llame a fmincon con la salida fval para obtener el valor de la función objetivo en la solución.

El ejemplo Minimizar con límites de restricción muestra dos soluciones. ¿Cuál es mejor? Ejecute el ejemplo solicitando tanto la salida fval como la solución.

fun = @(x)1+x(1)./(1+x(2)) - 3*x(1).*x(2) + x(2).*(1+x(1));
lb = [0,0];
ub = [1,2];
A = [];
b = [];
Aeq = [];
beq = [];
x0 = (lb + ub)/2;
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
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 = 1×2

    1.0000    2.0000

fval = -0.6667

Ejecute el problema utilizando un punto de inicio x0 diferente.

x0 = x0/5;
[x2,fval2] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
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.
x2 = 1×2
10-6 ×

    0.4000    0.4000

fval2 = 1.0000

Esta solución tiene un valor de función objetivo fval2 = 1, que es superior al primer valor fval = –0,6667. La primera solución x tiene un valor de función objetivo mínimo local inferior.

Para examinar fácilmente la calidad de una solución, solicite las salidas exitflag y output.

Configure el problema de minimizar la función de Rosenbrock en el disco de la unidad, $||x||^2 \le 1$. Cree primero una función que represente la restricción no lineal. Guárdela como un archivo llamado unitdisk.m en la ruta de MATLAB®.

function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [];

Cree las especificaciones de problema restantes.

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
nonlcon = @unitdisk;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
x0 = [0,0];

Llame a fmincon utilizando las salidas fval, exitflag y output.

[x,fval,exitflag,output] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
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


exitflag =

     1


output = 

  struct with fields:

         iterations: 24
          funcCount: 84
    constrviolation: 0
           stepsize: 6.9162e-06
          algorithm: 'interior-point'
      firstorderopt: 2.4373e-08
       cgiterations: 4
            message: 'Local minimum found that satisfies the constraints....'
       bestfeasible: [1x1 struct]

  • El valor exitflag 1 indica que la solución es un mínimo local.

  • La estructura output informa de varias estadísticas sobre el proceso de resolución. En concreto, indica el número de iteraciones en output.iterations, el número de evaluaciones de función en output.funcCount y la factibilidad en output.constrviolation.

De forma opcional, fmincon devuelve varias salidas que puede utilizar para analizar la solución indicada.

Configure el problema de minimizar la función de Rosenbrock en el disco de la unidad. Cree primero una función que represente la restricción no lineal. Guárdela como un archivo llamado unitdisk.m en la ruta de MATLAB®.

function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [];

Cree las especificaciones de problema restantes.

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
nonlcon = @unitdisk;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
x0 = [0,0];

Solicite todas las salidas fmincon.

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
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


exitflag =

     1


output = 

  struct with fields:

         iterations: 24
          funcCount: 84
    constrviolation: 0
           stepsize: 6.9162e-06
          algorithm: 'interior-point'
      firstorderopt: 2.4373e-08
       cgiterations: 4
            message: 'Local minimum found that satisfies the constraints....'
       bestfeasible: [1x1 struct]


lambda = 

  struct with fields:

         eqlin: [0x1 double]
      eqnonlin: [0x1 double]
       ineqlin: [0x1 double]
         lower: [2x1 double]
         upper: [2x1 double]
    ineqnonlin: 0.1215


grad =

   -0.1911
   -0.1501


hessian =

  497.2903 -314.5589
 -314.5589  200.2392

  • La salida lambda.ineqnonlin muestra que la restricción no lineal está activa en la solución y proporciona el valor del multiplicador de Lagrange asociado.

  • La salida grad proporciona el valor del gradiente de la función objetivo en la solución x.

  • La salida hessian se describe en Matriz hessiana de fmincon.

Argumentos de entrada

contraer todo

Función que desea minimizar, especificada como un identificador de función o un nombre de función. fun es una función que acepta un vector o un arreglo x y devuelve un escalar real f, con la función objetivo evaluada en x.

fmincon pasa x a la función objetivo y a todas las funciones de restricción no lineales en forma de argumento x0. Por ejemplo, si x0 es un arreglo de 5 por 3, fmincon pasa x a fun como un arreglo de 5 por 3. Sin embargo, fmincon multiplica las matrices de restricción lineales A o Aeq por x después de convertir x en el vector columna x(:).

Especifique fun como un identificador de función para un archivo:

x = fmincon(@myfun,x0,A,b)

donde myfun es una función de MATLAB® como

function f = myfun(x)
f = ...            % Compute function value at x

También puede especificar fun como un identificador de función para una función anónima:

x = fmincon(@(x)norm(x)^2,x0,A,b);

Si puede calcular el gradiente de fun y la opción SpecifyObjectiveGradient está establecida en true, según establece

options = optimoptions('fmincon','SpecifyObjectiveGradient',true)
fun debe devolver el vector gradiente g(x) en el segundo argumento de salida.

Si también puede calcular la matriz hessiana y la opción HessianFcn está establecida en 'objective' mediante optimoptions y la opción Algorithm es 'trust-region-reflective', fun debe devolver el valor hessiano H(x), una matriz simétrica, en un tercer argumento de salida. fun puede dar una matriz hessiana dispersa. Consulte Matriz hessiana para los algoritmos fminunc trust-region o fmincon trust-region-reflective para ver más detalles.

Si también puede calcular la matriz hessiana y la opción Algorithm está establecida en 'interior-point', hay una forma diferente de pasar la matriz hessiana a fmincon. Para obtener más información, consulte Matriz hessiana para el algoritmo fmincon interior-point. Para consultar un ejemplo en el que se utilice Symbolic Math Toolbox™ para calcular el gradiente y la matriz hessiana, consulte Calcular gradientes y matrices hessianas con Symbolic Math Toolbox.

Los algoritmos interior-point y trust-region-reflective le permiten proporcionar una función de multiplicación de matriz hessiana. Esta función da el resultado de un producto del vector por la matriz hessiana sin calcular la matriz hessiana directamente. Esto puede ahorrar memoria. Consulte Función de multiplicación de matriz hessiana.

Ejemplo: fun = @(x)sin(x(1))*cos(x(2))

Tipos de datos: char | function_handle | string

Punto inicial, especificado como un vector real o un arreglo real. Los solvers utilizan el número de elementos y el tamaño de x0 para determinar el número y el tamaño de las variables que acepta fun.

  • Algoritmo 'interior-point': si la opción HonorBounds es true (valor predeterminado), fmincon restablece los componentes x0 que se encuentren dentro o fuera de los límites lb o ub a los valores situados estrictamente entre los límites.

  • Algoritmo 'trust-region-reflective': fmincon restablece los componentes x0 no factibles a componentes factibles con respecto a los límites o a las igualdades lineales.

  • Algoritmo 'sqp', 'sqp-legacy' o 'active-set': fmincon restablece los componentes x0 que están fuera de los límites a los valores de los límites correspondientes.

Ejemplo: x0 = [1,2,3,4]

Tipos de datos: double

Restricciones de desigualdad lineales, especificadas como una matriz real. A es una matriz de M por N, donde M es el número de desigualdades y N es el número de variables (número de elementos de x0). Para problemas grandes, pase A como una matriz dispersa.

A codifica las M desigualdades lineales

A*x <= b,

donde x es el vector columna de N variables x(:) y b es un vector columna con M elementos.

Por ejemplo, considere estas desigualdades:

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

Especifique las desigualdades introduciendo las siguientes restricciones.

A = [1,2;3,4;5,6];
b = [10;20;30];

Ejemplo: Para especificar que los componentes de x suman 1 o menos, utilice A = ones(1,N) y b = 1.

Tipos de datos: double

Restricciones de desigualdad lineales, especificadas como un vector real. b es un vector de M elementos relacionado con la matriz A. Si pasa b como un vector fila, los solvers convierten internamente b en el vector columna b(:). Para problemas grandes, pase b como un vector disperso.

b codifica las M desigualdades lineales

A*x <= b,

donde x es el vector columna de N variables x(:) y A es una matriz de tamaño M por N.

Por ejemplo, considere estas desigualdades:

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30.

Especifique las desigualdades introduciendo las siguientes restricciones.

A = [1,2;3,4;5,6];
b = [10;20;30];

Ejemplo: Para especificar que los componentes de x suman 1 o menos, utilice A = ones(1,N) y b = 1.

Tipos de datos: double

Restricciones de igualdad lineales, especificadas como una matriz real. Aeq es una matriz de Me por N, donde Me es el número de igualdades y N es el número de variables (número de elementos de x0). Para problemas grandes, pase Aeq como una matriz dispersa.

Aeq codifica las Me igualdades lineales

Aeq*x = beq,

donde x es el vector columna de N variables x(:) y beq es un vector columna con Me elementos.

Por ejemplo, considere estas desigualdades:

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,

Especifique las desigualdades introduciendo las siguientes restricciones.

Aeq = [1,2,3;2,4,1];
beq = [10;20];

Ejemplo: Para especificar que los componentes de x suman 1, utilice Aeq = ones(1,N) y beq = 1.

Tipos de datos: double

Restricciones de igualdad lineales, especificadas como un vector real. beq es un vector de Me elementos relacionado con la matriz Aeq. Si pasa beq como un vector fila, los solvers convierten internamente beq en el vector columna beq(:). Para problemas grandes, pase beq como un vector disperso.

beq codifica las Me igualdades lineales

Aeq*x = beq,

donde x es el vector columna de N variables x(:) y Aeq es una matriz de tamaño Me por N.

Por ejemplo, considere estas igualdades:

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20.

Especifique las igualdades introduciendo las siguientes restricciones.

Aeq = [1,2,3;2,4,1];
beq = [10;20];

Ejemplo: Para especificar que los componentes de x suman 1, utilice Aeq = ones(1,N) y beq = 1.

Tipos de datos: double

Límites inferiores, especificados como un vector real o un arreglo real. Si el número de elementos en x0 es igual al número de elementos en lb, entonces lb especifica que

x(i) >= lb(i) para todo i.

Si numel(lb) < numel(x0), entonces lb especifica que

x(i) >= lb(i) para 1 <= i <= numel(lb).

Si lb tiene menos elementos que x0, los solvers emiten una advertencia.

Ejemplo: Para especificar que todos los componentes de x son positivos, utilice lb = zeros(size(x0)).

Tipos de datos: double

Límites superiores, especificados como un vector real o un arreglo real. Si el número de elementos en x0 es igual al número de elementos en ub, entonces ub especifica que

x(i) <= ub(i) para todo i.

Si numel(ub) < numel(x0), entonces ub especifica que

x(i) <= ub(i) para 1 <= i <= numel(ub).

Si ub tiene menos elementos que x0, los solvers emiten una advertencia.

Ejemplo: Para especificar que todos los componentes de x son menores que 1, utilice ub = ones(size(x0)).

Tipos de datos: double

Límites no lineales, especificados como un identificador de función o un nombre de función. nonlcon es una función que acepta un vector o arreglo x y devuelve dos arreglos, c(x) y ceq(x).

  • c(x) es el arreglo de restricciones de desigualdad no lineales de x. fmincon intenta satisfacer

    c(x) <= 0 para todas las entradas de c.

  • ceq(x) es el arreglo de restricciones de igualdad no lineales de x. fmincon intenta satisfacer

    ceq(x) = 0 para todas las entradas de ceq.

Por ejemplo:

x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon)

donde mycon es una función de MATLAB como

function [c,ceq] = mycon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.
Si los gradientes de las restricciones también pueden calcularse y la opción SpecifyConstraintGradient es true, según establece
options = optimoptions('fmincon','SpecifyConstraintGradient',true)
nonlcon también debe devolver, en el tercer y el cuarto argumentos de salida, GC, el gradiente de c(x), y GCeq, el gradiente de ceq(x). GC y GCeq pueden ser dispersos o densos. Si GC o GCeq son grandes, con relativamente pocas entradas distintas de cero, ahorre tiempo de ejecución y memoria en el algoritmo interior-point representándolos como matrices dispersas. Para obtener más información, consulte Restricciones no lineales.

Tipos de datos: char | function_handle | string

Opciones de optimización, especificadas como la salida de optimoptions o una estructura como la que devuelve optimset.

Algunas opciones son aplicables a todos los algoritmos y otras son relevantes para algoritmos particulares. Consulte Referencia de opciones de optimización para ver información detallada.

Algunas opciones no aparecen en la visualización optimoptions. Estas opciones se muestran en cursiva en la siguiente tabla. Para obtener más detalles, consulte Consultar las opciones de optimización.

Todos los algoritmos
Algorithm

Escoja el algoritmo de optimización:

  • 'interior-point' (valor predeterminado)

  • 'trust-region-reflective'

  • 'sqp'

  • 'sqp-legacy' (solo optimoptions)

  • 'active-set'

Para obtener información sobre cómo elegir el algoritmo, consulte Seleccionar el algoritmo.

El algoritmo trust-region-reflective requiere:

  • Que se suministre un gradiente en la función objetivo

  • Que SpecifyObjectiveGradient se establezca en true

  • Límites de restricción o bien restricciones de igualdad lineales, pero no ambos

Si selecciona el algoritmo 'trust-region-reflective' y no se satisfacen todas estas condiciones, fmincon genera un error.

Los algoritmos 'active-set', 'sqp-legacy' y 'sqp' no son a gran escala. Consulte Algoritmos a gran escala frente a algoritmos a media escala.

CheckGradients

Compare las derivadas proporcionadas por el usuario (gradientes de objetivo o de restricciones) con las derivadas de diferencias finitas. Las opciones son false (predeterminada) o true.

Para optimset, el nombre es DerivativeCheck y los valores son 'on' u 'off'. Consulte Nombres de opciones actuales y antiguos.

La opción CheckGradients se eliminará en una versión futura. Para comprobar las derivadas, utilice la función checkGradients.

ConstraintTolerance

Tolerancia en la vulneración de restricciones, un escalar positivo. La opción predeterminada es 1e-6. Consulte Tolerancias y criterios de detención.

Para optimset, el nombre es TolCon. Consulte Nombres de opciones actuales y antiguos.

Diagnóstico

Muestre información de diagnóstico sobre la función que se desea minimizar o resolver. Las opciones son 'off' (predeterminada) o 'on'.

DiffMaxChange

Cambio máximo en variables para gradientes de diferencias finitas (un escalar positivo). La opción predeterminada es Inf.

DiffMinChange

Cambio mínimo en variables para gradientes de diferencias finitas (un escalar positivo). La opción predeterminada es 0.

Display

Nivel de visualización (consulte Visualización iterativa):

  • 'off' o 'none' no muestran salida alguna.

  • 'iter' muestra la salida en cada iteración y emite el mensaje de salida predeterminado.

  • 'iter-detailed' muestra la salida en cada iteración y emite el mensaje de salida técnico.

  • 'notify' solo muestra la salida si la función no converge y emite el mensaje de salida predeterminado.

  • 'notify-detailed' solo muestra la salida si la función no converge y emite el mensaje de salida técnico.

  • 'final' (predeterminada) solo muestra la salida final y emite el mensaje de salida predeterminado.

  • 'final-detailed' solo muestra la salida final y emite el mensaje de salida técnico.

FiniteDifferenceStepSize

Factor de tamaño de paso de escalar o vector para diferencias finitas. Cuando establece FiniteDifferenceStepSize en un vector v, las diferencias finitas progresivas delta son

delta = v.*sign′(x).*max(abs(x),TypicalX);

, donde sign′(x) = sign(x) excepto sign′(0) = 1. Las diferencias finitas centrales son

delta = v.*max(abs(x),TypicalX);

Un escalar FiniteDifferenceStepSize se expande a un vector. La opción predeterminada es sqrt(eps) para diferencias finitas progresivas y eps^(1/3) para diferencias finitas centrales.

Para optimset, el nombre es FinDiffRelStep. Consulte Nombres de opciones actuales y antiguos.

FiniteDifferenceType

Las diferencias finitas, utilizadas para estimar gradientes, son o bien 'forward' (opción predeterminada), o bien 'central' (centradas). La opción 'central' requiere el doble de evaluaciones de función, pero debería ser más precisa. El algoritmo trust-region-reflective utiliza FiniteDifferenceType solo cuando CheckGradients está establecido en true.

fmincon respeta escrupulosamente los límites al estimar ambos tipos de diferencias finitas. De este modo, por ejemplo, podrá seleccionar una diferencia regresiva en lugar de progresiva para evitar realizar la evaluación en un punto fuera de los límites. Sin embargo, para el algoritmo interior-point, las diferencias 'central' pueden vulnerar límites durante la evaluación si la opción HonorBounds se establece en false.

Para optimset, el nombre es FinDiffType. Consulte Nombres de opciones actuales y antiguos.

FunValCheck

Compruebe si los valores de la función objetivo son válidos. El ajuste predeterminado, 'off', no realiza una comprobación. El ajuste 'on' muestra un error cuando la función objetivo devuelve un valor complex, Inf o NaN.

MaxFunctionEvaluations

Número máximo de evaluaciones de función permitidas, un entero positivo. El valor predeterminado para todos los algoritmos, excepto interior-point, es 100*numberOfVariables; para el algoritmo interior-point el valor predeterminado es 3000. Consulte Tolerancias y criterios de detención y Iteraciones y recuentos de la función.

Para optimset, el nombre es MaxFunEvals. Consulte Nombres de opciones actuales y antiguos.

MaxIterations

Número máximo de iteraciones permitidas, un entero positivo. El valor predeterminado para todos los algoritmos, excepto interior-point, es 400; para el algoritmo interior-point el valor predeterminado es 1000. Consulte Tolerancias y criterios de detención y Iteraciones y recuentos de la función.

Para optimset, el nombre es MaxIter. Consulte Nombres de opciones actuales y antiguos.

OptimalityTolerance

Tolerancia de terminación en la optimalidad de primer orden (un escalar positivo). La opción predeterminada es 1e-6. Consulte Medida de optimalidad de primer orden.

Para optimset, el nombre es TolFun. Consulte Nombres de opciones actuales y antiguos.

OutputFcn

Especifique una o varias funciones definidas por el usuario a las que una función de optimización llame en cada iteración. Pase un identificador de función o un arreglo de celdas de identificadores de función. La opción predeterminada es ninguno ([]). Consulte Sintaxis de función de salida y función de gráfica.

PlotFcn

Representa varias medidas de progreso mientras el algoritmo se ejecuta; seleccione una de las gráficas predefinidas o escriba la suya propia. Pase un nombre de función de gráfica integrada, un identificador de función o un arreglo de celdas de nombres de función de gráfica integrada o identificadores de función. Para funciones de gráfica personalizadas, pase identificadores de función. La opción predeterminada es ninguno ([]):

  • 'optimplotx' representa el punto actual

  • 'optimplotfunccount' representa el recuento de la función

  • 'optimplotfval' representa el valor de la función

  • 'optimplotfvalconstr' representa el mejor valor de función objetivo factible que se encuentra como gráfica de líneas. La gráfica muestra los puntos no factibles en un color y los puntos factibles en otro, con una tolerancia de factibilidad de 1e-6.

  • 'optimplotconstrviolation' representa la vulneración de restricciones máxima

  • 'optimplotstepsize' representa el tamaño de paso

  • 'optimplotfirstorderopt' representa la medida de optimalidad de primer orden

Las funciones de gráfica personalizadas utilizan la misma sintaxis que las funciones de salida. Consulte Funciones de salida para Optimization Toolbox y Sintaxis de función de salida y función de gráfica.

Para optimset, el nombre es PlotFcns. Consulte Nombres de opciones actuales y antiguos.

SpecifyConstraintGradient

Gradiente para las funciones de restricción no lineales definidas por el usuario. Si se establece en el valor predeterminado, false, fmincon estima los gradientes de las restricciones no lineales mediante diferencias finitas. Si se establece en true, fmincon prevé que la función de restricción tenga cuatro salidas, según se describe en nonlcon. El algoritmo trust-region-reflective no acepta restricciones no lineales.

Para optimset, el nombre es GradConstr y los valores son 'on' u 'off'. Consulte Nombres de opciones actuales y antiguos.

SpecifyObjectiveGradient

Gradiente para la función objetivo definida por el usuario. Consulte la descripción de fun para ver cómo definir el gradiente en fun. La opción predeterminada, false, hace que fmincon estime los gradientes utilizando diferencias finitas. Establezca la opción true para hacer que fmincon utilice un gradiente definido por el usuario de la función objetivo. Para utilizar el algoritmo 'trust-region-reflective', debe proporcionar el gradiente y establecer SpecifyObjectiveGradient en true.

Para optimset, el nombre es GradObj y los valores son 'on' u 'off'. Consulte Nombres de opciones actuales y antiguos.

StepTolerance

Tolerancia de terminación en x, un escalar positivo. El valor predeterminado para todos los algoritmos, excepto 'interior-point', es 1e-6; para el algoritmo 'interior-point', el valor predeterminado es 1e-10. Consulte Tolerancias y criterios de detención.

Para optimset, el nombre es TolX. Consulte Nombres de opciones actuales y antiguos.

TypicalX

Valores x típicos. El número de elementos en TypicalX es igual al número de elementos en x0, el punto de inicio. El valor predeterminado es ones(numberofvariables,1). fmincon utiliza TypicalX para escalar diferencias finitas para la estimación de gradientes.

El algoritmo 'trust-region-reflective' utiliza TypicalX solo para la opción CheckGradients.

UseParallel

Cuando true, fmincon estima gradientes en paralelo. Deshabilite la opción estableciéndola en el valor predeterminado, false. trust-region-reflective requiere un gradiente en el objetivo, por lo que UseParallel no es aplicable. Consulte Computación paralela.

Algoritmo trust-region-reflective
FunctionTolerance

Tolerancia de terminación en el valor de la función, un escalar positivo. La opción predeterminada es 1e-6. Consulte Tolerancias y criterios de detención.

Para optimset, el nombre es TolFun. Consulte Nombres de opciones actuales y antiguos.

HessianFcn

En caso de [] (valor predeterminado), fmincon aproxima la matriz hessiana utilizando diferencias finitas o utiliza una función de multiplicación de matriz hessiana (con la opción HessianMultiplyFcn). En caso de 'objective', fmincon utiliza una matriz hessiana definida por el usuario (definida en fun). Consulte Matriz hessiana como entrada.

Para optimset, el nombre es HessFcn. Consulte Nombres de opciones actuales y antiguos.

HessianMultiplyFcn

Función de multiplicación de matriz hessiana, especificada como un identificador de función. Para problemas estructurados a gran escala, esta función calcula el producto de la matriz hessiana H*Y sin formar H. La función tiene el formato

W = hmfun(Hinfo,Y)

donde Hinfo contiene una matriz utilizada para calcular H*Y.

El primer argumento es el mismo que el tercer argumento devuelto por la función objetivo fun, por ejemplo,

[f,g,Hinfo] = fun(x)

Y es una matriz que tiene el mismo número de filas que dimensiones hay en el problema. La matriz W = H*Y, aunque H no está formada explícitamente. fmincon utiliza Hinfo para calcular el precondicionador. Para obtener información sobre cómo proporcionar valores para cualquier parámetro adicional que hmfun necesite, consulte Pasar parámetros adicionales.

Nota

Para utilizar la opción HessianMultiplyFcn, HessianFcn debe establecerse en [] y SubproblemAlgorithm debe ser 'cg' (valor predeterminado).

Consulte Función de multiplicación de matriz hessiana. Para ver un ejemplo, consulte Minimization with Dense Structured Hessian, Linear Equalities.

Para optimset, el nombre es HessMult. Consulte Nombres de opciones actuales y antiguos.

HessPattern

Patrón de dispersión de la matriz hessiana para diferenciación finita. Establezca HessPattern(i,j) = 1 cuando puede tener ∂2fun/∂x(i)x(j) ≠ 0. De lo contrario, establezca HessPattern(i,j) = 0.

Utilice HessPattern cuando no sea conveniente calcular la matriz hessiana H en fun, pero puede determinar (por ejemplo, inspeccionándolo) cuándo el componente i-ésimo del gradiente de fun depende de x(j). fmincon puede aproximar H mediante diferencias finitas dispersas (del gradiente) si proporciona la estructura de dispersión de H como el valor para HessPattern. En otras palabras, proporcione la ubicación de los elementos distintos de cero.

Cuando la estructura sea desconocida, no establezca HessPattern. El comportamiento predeterminado es como si HessPattern fuera una matriz densa de unos. Entonces, fmincon calcula una aproximación completa de diferencias finitas en cada iteración. Este cálculo puede ser muy costoso para problemas grandes, por lo que normalmente es mejor determinar la estructura de dispersión.

MaxPCGIter

Número máximo de iteraciones de gradiente conjugado precondicionado (PCG), un escalar positivo. El valor predeterminado es max(1,floor(numberOfVariables/2)) para los problemas con límites de restricción y numberOfVariables para los problemas con restricciones de igualdad. Para obtener más información, consulte Método del gradiente conjugado precondicionado.

PrecondBandWidth

Ancho de banda superior del precondicionador para PCG, un entero no negativo. De forma predeterminada, se utiliza precondicionamiento diagonal (ancho de banda superior de 0). Para algunos problemas, aumentar el ancho de banda reduce el número de iteraciones PCG. Estableciendo PrecondBandWidth en Inf se utiliza una factorización directa (Cholesky) en lugar de los gradientes conjugados (CG). La factorización directa es más costosa computacionalmente que CG, pero produce un paso de mejor calidad hacia la solución.

SubproblemAlgorithm

Determina cómo se calcula el paso de iteración. La opción predeterminada, 'cg', realiza un paso más rápido, pero menos preciso que 'factorization'. Consulte Algoritmo fmincon trust-region-reflective.

Para optimset, no puede establecer un valor no predeterminado. Para utilizar 'factorization', establezca las opciones utilizando optimoptions.

TolPCG

Tolerancia de terminación en la iteración PCG, un escalar positivo. La opción predeterminada es 0.1.

Algoritmo de conjunto activo
FunctionTolerance

Tolerancia de terminación en el valor de la función, un escalar positivo. La opción predeterminada es 1e-6. Consulte Tolerancias y criterios de detención.

Para optimset, el nombre es TolFun. Consulte Nombres de opciones actuales y antiguos.

MaxSQPIter

Número máximo de iteraciones SQP permitidas, un entero positivo. La opción predeterminada es 10*max(numberOfVariables, numberOfInequalities + numberOfBounds).

RelLineSrchBnd

Límite relativo (un valor de escalar no negativo real) de la longitud de paso de búsqueda de recta. El desplazamiento total de x satisface x(i)| ≤ relLineSrchBnd· max(|x(i)|,|typicalx(i)|). Esta opción permite controlar la magnitud de los desplazamientos de x en casos en los que el solver dé pasos que se consideren demasiado grandes. El valor predeterminado es sin límites ([]).

RelLineSrchBndDuration

Número de iteraciones para el cual debe estar activo el límite que se especifica en RelLineSrchBnd (el valor predeterminado es 1).

TolConSQP

Tolerancia de terminación de vulneración de restricciones SQP de iteración interior, un escalar positivo. La opción predeterminada es 1e-6.

Algoritmo interior-point
BarrierParamUpdate

Especifica cómo fmincon actualiza el parámetro de barrera (consulte Algoritmo interior-point de fmincon). Las opciones son:

  • 'monotone' (valor predeterminado)

  • 'predictor-corrector'

Esta opción puede afectar a la velocidad y la convergencia del solver, pero su efecto no es fácil de predecir.

EnableFeasibilityMode

Cuando es true, fmincon utiliza un algoritmo distinto para alcanzar la factibilidad. Este ajuste puede ayudar a fmincon a alcanzar una solución factible en algunos casos. El valor predeterminado es false.

El modo de factibilidad suele funcionar mejor cuando SubproblemAlgorithm es 'cg'. Para obtener más detalles, consulte Modo de factibilidad. Para ver un ejemplo, consulte Obtener una solución utilizando el modo de factibilidad.

HessianApproximation

Especifica cómo fmincon calcula la matriz hessiana (consulte Matriz hessiana como entrada). Las opciones son las siguientes:

  • 'bfgs' (valor predeterminado)

  • 'finite-difference'

  • 'lbfgs'

  • {'lbfgs',Positive Integer}

Nota

Para utilizar HessianApproximation, tanto HessianFcn como HessianMultiplyFcn deben ser entradas vacías ([]).

Para optimset, el nombre es Hessian y los valores son 'user-supplied', 'bfgs', 'lbfgs', 'fin-diff-grads', 'on' o 'off'. Consulte Nombres de opciones actuales y antiguos.

HessianFcn

En caso de [] (valor predeterminado), fmincon aproxima la matriz hessiana utilizando el método que se especifica en HessianApproximation o utiliza una HessianMultiplyFcn proporcionada. En caso de identificador de función, fmincon utiliza HessianFcn para calcular la matriz hessiana. Consulte Matriz hessiana como entrada.

Para optimset, el nombre es HessFcn. Consulte Nombres de opciones actuales y antiguos.

HessianMultiplyFcn

Función proporcionada por el usuario que proporciona un producto del vector por la matriz hessiana (consulte Función de multiplicación de matriz hessiana). Pase un identificador de función.

Nota

Para utilizar la opción HessianMultiplyFcn, HessianFcn debe establecerse en [] y SubproblemAlgorithm debe ser 'cg'.

Para optimset, el nombre es HessMult. Consulte Nombres de opciones actuales y antiguos.

HonorBounds

La opción predeterminada true garantiza que los límites de restricción se satisfagan en todas las iteraciones. Deshabilite la opción estableciéndola en false.

Para optimset, el nombre es AlwaysHonorConstraints y los valores son 'bounds' u 'none'. Consulte Nombres de opciones actuales y antiguos.

InitBarrierParam

Valor de barrera inicial, un escalar positivo. En ocasiones puede resultar útil probar un valor superior al valor predeterminado 0.1, sobre todo si las funciones objetivo o de restricción son grandes.

InitTrustRegionRadius

Radio inicial de la región de confianza, un escalar positivo. En problemas mal escalados puede resultar útil escoger un valor menor que el valor predeterminado n, donde n es el número de variables.

MaxProjCGIter

Una tolerancia (criterio de detención) para el número de iteraciones de gradiente conjugado proyectado; se trata de una iteración interior, no del número de iteraciones del algoritmo. Este entero positivo tiene un valor predeterminado de 2*(numberOfVariables - numberOfEqualities).

ObjectiveLimit

Una tolerancia (criterio de detención) que es un escalar. Si el valor de la función objetivo es inferior a ObjectiveLimit y la iteración es factible, las iteraciones se detienen porque se supone que el problema está desacotado. El valor predeterminado es -1e20.

ScaleProblem

true provoca que el algoritmo normalice todas las restricciones y la función objetivo. Deshabilite la opción estableciéndola en la opción predeterminada, false.

Para optimset, los valores posibles son 'obj-and-constr' o 'none'. Consulte Nombres de opciones actuales y antiguos.

SubproblemAlgorithm

Determina cómo se calcula el paso de iteración. El valor predeterminado, 'factorization', suele ser más rápido que 'cg' (gradiente conjugado), aunque 'cg' puede ser más rápido para problemas grandes con matrices hessianas densas. Consulte Algoritmo interior-point de fmincon.

Para optimset, los valores posibles son 'cg' y 'ldl-factorization'. Consulte Nombres de opciones actuales y antiguos.

TolProjCG

Una tolerancia (criterio de detención) para el algoritmo de gradiente conjugado proyectado; se trata de una iteración interior, no de la iteración del algoritmo. Este escalar positivo tiene un valor predeterminado de 0.01.

TolProjCGAbs

Tolerancia absoluta (criterio de detención) para el algoritmo de gradiente conjugado proyectado; se trata de una iteración interior, no de la iteración del algoritmo. Este escalar positivo tiene un valor predeterminado de 1e-10.

Algoritmos SQP y SQP antiguo
ObjectiveLimit

Una tolerancia (criterio de detención) que es un escalar. Si el valor de la función objetivo es inferior a ObjectiveLimit y la iteración es factible, las iteraciones se detienen porque se supone que el problema está desacotado. El valor predeterminado es -1e20.

ScaleProblem

true provoca que el algoritmo normalice todas las restricciones y la función objetivo. Deshabilite la opción estableciéndola en la opción predeterminada, false.

Para optimset, los valores posibles son 'obj-and-constr' o 'none'. Consulte Nombres de opciones actuales y antiguos.

Ejemplo: options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true)

Estructura de problema, especificada como una estructura con los siguientes campos:

Nombre de campoEntrada

objective

Función objetivo

x0

Punto inicial para x

Aineq

Matriz para restricciones de desigualdad lineales

bineq

Vector para restricciones de desigualdad lineales

Aeq

Matriz para restricciones de igualdad lineales

beq

Vector para restricciones de igualdad lineales
lbVector de límites inferiores
ubVector de límites superiores

nonlcon

Función de restricción no lineal

solver

'fmincon'

options

Opciones creadas con optimoptions

Debe proporcionar al menos los campos objective, x0, solver y options en la estructura problem.

Tipos de datos: struct

Argumentos de salida

contraer todo

Solución, devuelta como un vector real o un arreglo real. El tamaño de x es el mismo que el tamaño de x0. Habitualmente, x es una solución local al problema cuando exitflag es positivo. Para obtener información sobre la calidad de la solución, consulte Cuando el solver tiene éxito.

Valor de la función objetivo en la solución, devuelto como un número real. Por lo general, fval = fun(x).

Razón por la que fmincon se ha detenido, devuelta como un entero.

Todos los algoritmos:

1

La medida de optimalidad de primer orden fue inferior a options.OptimalityTolerance y la vulneración de restricciones máxima fue inferior a options.ConstraintTolerance.

0

El número de iteraciones ha sobrepasado options.MaxIterations o el número de evaluaciones de función ha sobrepasado options.MaxFunctionEvaluations.

-1

Detenido por una función de salida o una función de gráfica.

-2

No se ha encontrado ningún punto factible.

Todos los algoritmos excepto active-set:

2

El cambio en x fue inferior a options.StepTolerance y la vulneración de restricciones máxima fue inferior a options.ConstraintTolerance.

Solo el algoritmo trust-region-reflective:

3

El cambio en el valor de la función objetivo fue inferior a options.FunctionTolerance y la vulneración de restricciones máxima fue inferior a options.ConstraintTolerance.

Solo el algoritmo active-set:

4

La magnitud de la dirección de búsqueda fue inferior a 2*options.StepTolerance y la vulneración de restricciones máxima fue inferior a options.ConstraintTolerance.

5

La magnitud de la derivada direccional en la dirección de búsqueda fue inferior a 2*options.OptimalityTolerance y la vulneración de restricciones máxima fue inferior a options.ConstraintTolerance.

Algoritmos interior-point, sqp-legacy y sqp:

-3

La función objetivo en la iteración actual ha descendido por debajo de options.ObjectiveLimit y la vulneración de restricciones máxima fue inferior a options.ConstraintTolerance.

Información sobre el proceso de optimización, devuelta como estructura con campos:

iterations

Número de iteraciones realizadas

funcCount

Número de evaluaciones de función

lssteplength

Tamaño del paso de búsqueda de recta relativo a la dirección de búsqueda (solo algoritmos active-set y sqp)

constrviolation

Máximo de funciones de restricción

stepsize

Longitud de último desplazamiento en x (no en el algoritmo active-set)

algorithm

Algoritmo de optimización utilizado

cgiterations

Número total de iteraciones PCG (solo algoritmos trust-region-reflective y interior-point)

firstorderopt

Medida de optimalidad de primer orden

bestfeasible

Mejor punto factible (menor función objetivo) encontrado. Una estructura con los siguientes campos:

  • x

  • fval

  • firstorderopt

  • constrviolation

Si no se encuentra ningún punto factible, el campo bestfeasible está vacío. Para este fin, un punto es factible cuando el máximo de las funciones de restricción no supera options.ConstraintTolerance.

El punto bestfeasible puede diferir del punto de solución devuelto x por distintos motivos. Para ver un ejemplo, consulte Obtain Best Feasible Point.

message

Mensaje de salida

Multiplicadores de Lagrange en la solución, devueltos como una estructura con campos:

lower

Límites inferiores que corresponden a lb

upper

Límites superiores que corresponden a ub

ineqlin

Desigualdades lineales que corresponden a A y b

eqlin

Igualdades lineales que corresponden a Aeq y beq

ineqnonlin

Desigualdades no lineales que corresponden a c en nonlcon

eqnonlin

Igualdades no lineales que corresponden a ceq en nonlcon

Gradiente en la solución, devuelto como un vector real. grad indica el gradiente de fun en el punto x(:).

Matriz hessiana aproximada, devuelta como una matriz real. Para saber cuál es el significado de hessian, consulte Salida de matriz hessiana.

Limitaciones

  • fmincon es un método basado en gradientes que está diseñado para funcionar con problemas en los que tanto la función objetivo como la de restricción son continuas y tienen primeras derivadas continuas.

  • Para el algoritmo 'trust-region-reflective', debe proporcionar el gradiente en fun y establecer la opción 'SpecifyObjectiveGradient' en true.

  • El algoritmo 'trust-region-reflective' no permite límites superiores e inferiores iguales. Por ejemplo, si lb(2)==ub(2), fmincon arroja este error:

    Equal upper and lower bounds not permitted in trust-region-reflective algorithm. Use
    either interior-point or SQP algorithms instead.
  • Hay dos sintaxis distintas para pasar una matriz hessiana y dos sintaxis distintas para pasar una función HessianMultiplyFcn, una para trust-region-reflective y otra para interior-point. Consulte Incluir matrices hessianas.

    • Para trust-region-reflective, la matriz hessiana del lagrangiano es la misma que la matriz Hessiana de la función objetivo. La matriz hessiana se pasa como la tercera salida de la función objetivo.

    • Para interior-point, la matriz hessiana del lagrangiano implica los multiplicadores de Lagrange y las matrices hessianas de las funciones de restricción no lineales. La matriz hessiana se pasa como una función independiente que tiene en cuenta tanto el punto actual x como la estructura de multiplicadores de Lagrange lambda.

  • Cuando el problema no es factible, fmincon intenta minimizar el valor de restricción máximo.

Más acerca de

contraer todo

Matriz hessiana como entrada

fmincon utiliza una matriz hessiana como entrada opcional. Esta matriz hessiana es la matriz de segundas derivadas del lagrangiano (consulte Ecuación 1), en concreto,

xx2L(x,λ)=2f(x)+λi2ci(x)+λi2ceqi(x).(1)

Para obtener información detallada sobre cómo proporcionar una matriz hessiana a los algoritmos trust-region-reflective o interior-point, consulte Incluir matrices hessianas.

Los algoritmos active-set y sqp no aceptan una matriz hessiana de entrada. Calculan una aproximación cuasi-Newton a la matriz hessiana del lagrangiano.

El algoritmo interior-point tiene varias opciones para la opción 'HessianApproximation'; consulte Escoger una aproximación de matriz hessiana de entrada para fmincon interior-point:

  • 'bfgs': fmincon calcula la matriz hessiana mediante una aproximación cuasi-Newton densa. Se trata de la aproximación predeterminada de la matriz hessiana.

  • 'lbfgs': fmincon calcula la matriz hessiana mediante una aproximación cuasi-Newton a gran escala con memoria limitada. Se utiliza la memoria predeterminada de 10 iteraciones.

  • {'lbfgs',positive integer}: fmincon calcula la matriz hessiana mediante una aproximación cuasi-Newton a gran escala con memoria limitada. El entero positivo especifica cuántas iteraciones anteriores se deben recordar.

  • 'finite-difference': fmincon calcula un producto del vector por la matriz hessiana mediante diferencias finitas del gradiente o los gradientes. Debe proporcionar el gradiente de la función objetivo y gradientes de restricciones no lineales (en caso de haberlos). Establezca la opción 'SpecifyObjectiveGradient' en true y, si procede, la opción 'SpecifyConstraintGradient' en true. Debe establecer 'SubproblemAlgorithm' en 'cg'.

Función de multiplicación de matriz hessiana

Los algoritmos interior-point y trust-region-reflective le permiten proporcionar una función de multiplicación de matriz hessiana. Esta función da el resultado de un producto del vector por la matriz hessiana sin calcular la matriz hessiana directamente. Esto puede ahorrar memoria. Para obtener más detalles, consulte Función de multiplicación de matriz hessiana.

Algoritmos

contraer todo

Seleccionar el algoritmo

Para obtener ayuda a la hora de seleccionar el algoritmo, consulte Algoritmos fmincon. Para establecer el algoritmo, utilice optimoptions para crear options y utilice también el par nombre-valor 'Algorithm'.

El resto de esta sección le ofrece breves resúmenes o referencias a información sobre cada algoritmo.

Optimización interior-point

Este algoritmo se describe en Algoritmo interior-point de fmincon. Hay una descripción más completa en [1], [41] y [9].

Optimización de SQP y de SQP antiguo

Los algoritmos fmincon 'sqp' y 'sqp-legacy' son similares al algoritmo 'active-set' que se describe en Optimización del conjunto activo. Algoritmo SQP de fmincon describe las principales diferencias. En resumen, tales diferencias son las siguientes:

Optimización del conjunto activo

fmincon utiliza un método de programación cuadrática secuencial (SQP). En este método, la función resuelve un subproblema de programación cuadrática (QP) en cada iteración. fmincon actualiza una estimación de la matriz hessiana del lagrangiano en cada iteración utilizando la fórmula BFGS (consulte fminunc y las referencias [7] y [8]).

fmincon realiza una búsqueda de recta utilizando una función de mérito similar a la que proponen [6], [7] y [8]. El subproblema de QP se resuelve utilizando una estrategia de conjunto activo similar a la que se describe en [5]. Algoritmo fmincon Active-Set describe este algoritmo en detalle.

Consulte también Implementación de SQP para obtener más detalles sobre el algoritmo utilizado.

Optimización trust-region-reflective

El algoritmo 'trust-region-reflective' es un método de región de confianza de subespacio y se basa en el método de Newton de reflejo de punto interior descrito en [3] y [4]. Cada iteración implica la solución aproximada de un sistema lineal amplio utilizando el método de gradientes conjugados precondicionados (PCG). Consulte las descripciones del método trust-region y del gradiente conjugado precondicionado en Algoritmo fmincon trust-region-reflective.

Funcionalidad alternativa

App

La tarea Optimize de Live Editor proporciona una interfaz visual para fmincon.

Referencias

[1] Byrd, R. H., J. C. Gilbert, and J. Nocedal. “A Trust Region Method Based on Interior Point Techniques for Nonlinear Programming.” Mathematical Programming, Vol 89, No. 1, 2000, pp. 149–185.

[2] Byrd, R. H., Mary E. Hribar, and Jorge Nocedal. “An Interior Point Algorithm for Large-Scale Nonlinear Programming.” SIAM Journal on Optimization, Vol 9, No. 4, 1999, pp. 877–900.

[3] Coleman, T. F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.

[4] Coleman, T. F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.

[5] Gill, P. E., W. Murray, and M. H. Wright. Practical Optimization, London, Academic Press, 1981.

[6] Han, S. P. “A Globally Convergent Method for Nonlinear Programming.” Journal of Optimization Theory and Applications, Vol. 22, 1977, pp. 297.

[7] Powell, M. J. D. “A Fast Algorithm for Nonlinearly Constrained Optimization Calculations.” Numerical Analysis, ed. G. A. Watson, Lecture Notes in Mathematics, Springer-Verlag, Vol. 630, 1978.

[8] Powell, M. J. D. “The Convergence of Variable Metric Methods For Nonlinearly Constrained Optimization Calculations.” Nonlinear Programming 3 (O. L. Mangasarian, R. R. Meyer, and S. M. Robinson, eds.), Academic Press, 1978.

[9] Waltz, R. A., J. L. Morales, J. Nocedal, and D. Orban. “An interior algorithm for nonlinear optimization that combines line search and trust region steps.” Mathematical Programming, Vol 107, No. 3, 2006, pp. 391–408.

Capacidades ampliadas

Historial de versiones

Introducido antes de R2006a

expandir todo