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:
Empezar desde diferentes puntos. Consulte Cambiar el punto inicial.
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.
Cambiar las tolerancias, como
OptimalityTolerance
,ConstraintTolerance
yStepTolerance
. Consulte Utilizar las tolerancias adecuadas.Escalar el problema de manera que cada coordenada tenga aproximadamente el mismo efecto. Consulte Volver a escalar el problema.
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
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 opció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:
fmincon
interior-point
. Escriba la matriz hessiana como una función separada. Para ver un ejemplo, consulte Algoritmo interior-point de fmincon con matriz hessiana analítica.fmincon
trust-region-reflective
. Proporcione la matriz hessiana como tercera salida de la función objetivo. Para ver un ejemplo, consulte Minimization with Dense Structured Hessian, Linear Equalities.fminunc
trust-region
. Proporcione la matriz hessiana como tercera salida de la función objetivo. Para ver un ejemplo, consulte Minimización con gradiente y matriz hessiana.
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.