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.

Cuando es posible que el solver haya tenido éxito

El punto final es igual al punto inicial

El punto inicial parece ser un mínimo local o solución porque la medida de optimalidad de primer orden está cerca de 0. Puede que este resultado no resulte satisfactorio, dado que el solver no ha mejorado el punto inicial.

Si no está seguro de que el punto inicial es verdaderamente un mínimo local, intente:

  1. Empezar desde diferentes puntos. Consulte Cambiar el punto inicial.

  2. Comprobar que el objetivo y las restricciones están definidos correctamente (por ejemplo, ¿devuelven los valores correctos en algunos puntos?). Consulte Comprobar la función objetivo y la función de restricción. Compruebe que un punto no factible no cause ningún error en las funciones; consulte Las iteraciones pueden vulnerar las restricciones.

  3. Cambiar las tolerancias, como OptimalityTolerance, ConstraintTolerance y StepTolerance. Consulte Utilizar las tolerancias adecuadas.

  4. Escalar el problema de manera que cada coordenada tenga aproximadamente el mismo efecto. Consulte Volver a escalar el problema.

  5. Proporcionar información del gradiente y de la matriz hessiana. Consulte Proporcionar gradientes analíticos o matrices jacobianas y Proporcionar una matriz hessiana.

Mínimo local posible

El solver puede haber alcanzado un mínimo local, pero no puede estar seguro porque la medida de optimalidad de primer orden no es menor que la tolerancia OptimalityTolerance. (Para obtener más información sobre la medida de optimalidad de primer orden, consulte Medida de optimalidad de primer orden). Para comprobar si la solución indicada es fiable, considere las siguientes sugerencias.

1. Funciones no suaves
2. Volver a ejecutar comenzando en el punto final
3. Probar un algoritmo diferente
4. Cambiar tolerancias
5. Volver a escalar el problema
6. Comprobar los puntos cercanos
7. Cambiar las opciones de las diferencias finitas
8. Proporcionar gradientes analíticos o matrices jacobianas
9. Proporcionar una matriz hessiana

1. Funciones no suaves

Si intenta minimizar una función no suave o que tiene restricciones no suaves, el mejor mensaje de salida puede ser "Mínimo local posible". Esto se debe a que las condiciones de optimalidad de primer orden no se aplican a un punto no suave.

Para asegurarse de que la solución es adecuada, intente Comprobar los puntos cercanos.

2. Volver a ejecutar comenzando en el punto final

Volver a comenzar una optimización en el punto final puede llevar a una solución con una medida de optimalidad de primer orden mejor. Una medida de optimalidad de primer orden mejor (más baja) da más razones para creer que la respuesta es fiable.

Por ejemplo, considere el siguiente problema de minimización, tomado del ejemplo Using Symbolic Mathematics with Optimization Toolbox Solvers:

options = optimoptions('fminunc','Algorithm','quasi-newton');
funh = @(x)log(1 + (x(1) - 4/3)^2 + 3*(x(2) - (x(1)^3 - x(1)))^2);
[xfinal fval exitflag] = fminunc(funh,[-1;2],options)

Local minimum possible.

fminunc stopped because it cannot decrease the 
objective function along the current search direction.

xfinal =
    1.3333
    1.0370

fval =
  8.5265e-014

exitflag =
     5

El valor del indicador de salida de 5 indica que la medida de optimalidad de primer orden estaba por encima de la tolerancia de la función. Vuelva a ejecutar la minimización comenzando desde xfinal:

[xfinal2 fval2 exitflag2] = fminunc(funh,xfinal,options)

Local minimum found.

Optimization completed because the size of the gradient is 
less than the default value of the function tolerance.

xfinal2 =
    1.3333
    1.0370

fval2 =
  6.5281e-014

exitflag2 =
     1

El mínimo local es "encontrado", no "posible", y el exitflag es 1, no 5. Las dos soluciones son prácticamente idénticas. No obstante, la segunda ejecución tiene un mensaje de salida más satisfactorio, dado que la medida de optimalidad de primer orden era lo suficientemente baja: 7.5996e-007 en lugar de 3.9674e-006.

3. Probar un algoritmo diferente

Muchos solvers permiten seleccionar el algoritmo. Diferentes algoritmos pueden llevar al uso de diferentes criterios de detención.

Por ejemplo, Volver a ejecutar comenzando en el punto final devuelve el exitflag 5 desde la primera ejecución. Esta ejecución utiliza el algoritmo quasi-newton.

El algoritmo trust-region requiere un gradiente proporcionado por el usuario. betopt.m contiene un cálculo de la función objetivo y del gradiente:

function [f gradf] = betopt(x)

g = 1 + (x(1)-4/3)^2 + 3*(x(2) - (x(1)^3-x(1)))^2;
f = log(g);
gradf(1) = 2*(x(1)-4/3) + 6*(x(2) - (x(1)^3-x(1)))*(1-3*x(1)^2);
gradf(1) = gradf(1)/g;
gradf(2) = 6*(x(2) - (x(1)^3 -x(1)))/g;

Ejecutar la optimización utilizando el algoritmo trust-region da como resultado un exitflag diferente:

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
[xfinal3 fval3 exitflag3] = fminunc(@betopt,[-1;2],options)

Local minimum possible.

fminunc stopped because the final change in function value 
relative to its initial value is less than the default value 
of the function tolerance.

xfinal3 =
    1.3333
    1.0370

fval3 =
  7.6659e-012

exitflag3 =
     3

La condición de salida es mejor que la condición quasi-newton, aunque sigue sin ser la mejor. Volver a ejecutar el algoritmo desde el punto inicial produce un punto mejor, con una medida de optimalidad de primer orden extremadamente pequeña:

[xfinal4 fval4 eflag4 output4] = fminunc(@betopt,xfinal3,options)

Local minimum found.

Optimization completed because the size of the gradient is 
less than the default value of the function tolerance.

xfinal4 =

    1.3333
    1.0370

fval4 =
     0

eflag4 =
     1

output4 = 
         iterations: 1
          funcCount: 2
       cgiterations: 1
      firstorderopt: 7.5497e-11
          algorithm: 'trust-region'
            message: 'Local minimum found.

Optimization completed because the size o...'
    constrviolation: []

4. Cambiar tolerancias

En ocasiones, ajustar o flexibilizar tolerancias lleva a un resultado más satisfactorio. Por ejemplo, elija un valor más pequeño de OptimalityTolerance en la sección Probar un algoritmo diferente:

options = optimoptions('fminunc','Algorithm','trust-region',...
    'OptimalityTolerance',1e-8,'SpecifyObjectiveGradient',true); % default=1e-6
[xfinal3 fval3 eflag3 output3] = fminunc(@betopt,[-1;2],options)

Local minimum found.

Optimization completed because the size of the gradient is 
less than the selected value of the function tolerance.

xfinal3 =
    1.3333
    1.0370

fval3 =
     0

eflag3 =
     1

output3 = 
         iterations: 15
          funcCount: 16
       cgiterations: 12
      firstorderopt: 7.5497e-11
          algorithm: 'trust-region'
            message: 'Local minimum found.

Optimization completed because the size...'
    constrviolation: []

fminunc necesitó una iteración más que antes, llegando a una solución mejor.

5. Volver a escalar el problema

Intente que cada coordenada tenga aproximadamente el mismo efecto en la función objetivo y la función de restricción escalando y centrando. Para obtener ejemplos, consulte Centrar y escalar el problema.

6. Comprobar los puntos cercanos

Evalúe la función objetivo y las restricciones, si existen, en puntos cerca del punto final. Si el punto final es un mínimo local, los puntos factibles cercanos tienen valores de la función objetivo mayores. Consulte Comprobar los puntos cercanos para obtener un ejemplo.

Si tiene una licencia de Global Optimization Toolbox, intente ejecutar el solver patternsearch (Global Optimization Toolbox) desde el punto final. patternsearch examina los puntos cercanos y acepta todos los tipos de restricciones.

7. Cambiar las opciones de las diferencias finitas

Lleva más tiempo evaluar las diferencias centrales finitas, pero son mucho más precisas. Utilice las diferencias centrales cuando el problema pueda tener una curvatura alta.

Para elegir diferencias centrales en la línea de comandos, utilice optimoptions para establecer 'FiniteDifferenceType' en 'central' en lugar del valor predeterminado 'forward'.

8. Proporcionar gradientes analíticos o matrices jacobianas

Si no proporciona gradientes o matrices jacobianas, los solvers estiman gradientes y matrices jacobianas mediante diferencias finitas. Por tanto, proporcionar estas derivadas puede ahorrar tiempo computacional y puede conducir a un aumento de la precisión. El enfoque basado en problemas puede proporcionar gradientes de manera automática; consulte Automatic Differentiation in Optimization Toolbox.

Para problemas restringidos, proporcionar un gradiente ofrece otra ventaja. Un solver puede alcanzar un punto x de forma que x sea factible, pero las diferencias finitas alrededor de x siempre conduzcan a un punto no factible. En este caso, un solver puede fallar o detenerse prematuramente. Proporcionar un gradiente permite al solver continuar.

Proporcione gradientes o matrices jacobianas en los archivos para la función objetivo y funciones de restricción no lineales. Para obtener detalles de la sintaxis, consulte Escribir funciones objetivo escalares, Escribir funciones objetivo de vector y de matriz y Restricciones no lineales.

Para comprobar que su gradiente o matriz jacobiana es correcta, utilice la función checkGradients, tal y como se describe en Checking Validity of Gradients or Jacobians.

Si tiene una licencia de Symbolic Math Toolbox™, puede calcular gradientes y matrices hessianas de forma programática. Para ver un ejemplo, consulte Calcular gradientes y matrices hessianas con Symbolic Math Toolbox.

Para ejemplos utilizando gradientes y matrices jacobianas, consulte Minimización con gradiente y matriz hessiana, Restricciones no lineales con gradientes, Calcular gradientes y matrices hessianas con Symbolic Math Toolbox, Resolver un sistema no lineal, sin y con matrices jacobianas y Large Sparse System of Nonlinear Equations with Jacobian. Para la diferenciación automática en el enfoque basado en problemas, consulte Effect of Automatic Differentiation in Problem-Based Optimization.

9. Proporcionar una matriz hessiana

A menudo, los solvers se ejecutan con más fiabilidad y con menos iteraciones cuando proporciona una matriz hessiana.

Los siguientes solvers y algoritmos aceptan matrices hessianas:

Si tiene una licencia de Symbolic Math Toolbox, puede calcular gradientes y matrices hessianas de forma programática. Para ver un ejemplo, consulte Calcular gradientes y matrices hessianas con Symbolic Math Toolbox. Para proporcionar una matriz hessiana en el enfoque basado en problemas, consulte Supply Derivatives in Problem-Based Workflow.

El ejemplo en Calcular gradientes y matrices hessianas con Symbolic Math Toolbox muestra fmincon realizando 77 iteraciones sin una matriz hessiana, pero solo 19 iteraciones con una matriz hessiana.