Cuando el solver tiene éxito
¿Qué puede salir mal si el solver tiene éxito?
Un solver puede informar del éxito de una minimización, pero puede ocurrir que la solución indicada sea incorrecta. Como ejemplo trivial, considere minimizar la función f(x) = x3 para x entre –2 y 2, comenzando por el punto 1/3
:
options = optimoptions('fmincon','Algorithm','active-set'); ffun = @(x)x^3; xfinal = fmincon(ffun,1/3,[],[],[],[],-2,2,[],options) Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the default valueof the function tolerance, and constraints were satisfied to within the default value of the constraint tolerance. No active inequalities. xfinal = -1.5056e-008
El mínimo real tiene lugar en x = -2
. fmincon
proporciona esta información porque la función f(x) es muy plana cerca de x = 0.
Otro problema habitual es que un solver encuentra un mínimo local, pero usted puede desear un mínimo global. Para obtener más información, consulte Óptimos locales frente a globales.
Lección: compruebe los resultados, incluso aunque el solver informe de que ha "encontrado" un mínimo local o de que ha "resuelto" una ecuación.
Esta sección ofrece técnicas para verificar los resultados.
1. Cambiar el punto inicial
El punto inicial puede tener un efecto importante sobre la solución. Si obtiene las mismas soluciones u otras peores desde varios puntos iniciales, confiará más en su solución.
Por ejemplo, minimice f(x) = x3 + x4 comenzando por el punto 1/4:
ffun = @(x)x^3 + x^4; options = optimoptions('fminunc','Algorithm','quasi-newton'); [xfinal fval] = fminunc(ffun,1/4,options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. x = -1.6764e-008 fval = -4.7111e-024
Cambie ligeramente el punto inicial y el solver encontrará una solución mejor:
[xfinal fval] = fminunc(ffun,1/4+.001,options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. xfinal = -0.7500 fval = -0.1055
x = -0.75
es la solución global; comenzar por otros puntos no puede mejorar la solución.
Para obtener más información, consulte Óptimos locales frente a globales.
2. Comprobar los puntos cercanos
Para ver si hay valores mejores que los de la solución indicada, evalúe la función objetivo y las restricciones en varios puntos cercanos.
Por ejemplo, con la función objetivo ffun
de ¿Qué puede salir mal si el solver tiene éxito? y el punto final xfinal = -1.5056e-008
, calcule ffun(xfinal±Δ)
para algunos Δ
:
delta = .1; [ffun(xfinal),ffun(xfinal+delta),ffun(xfinal-delta)] ans = -0.0000 0.0011 -0.0009
La función objetivo es menor en ffun(xfinal-Δ)
, por lo que el solver ha proporcionado una solución incorrecta.
Un ejemplo menos trivial:
options = optimoptions(@fmincon,'Algorithm','active-set'); lb = [0,-1]; ub = [1,1]; ffun = @(x)(x(1)-(x(1)-x(2))^2); [x fval exitflag] = fmincon(ffun,[1/2 1/3],[],[],[],[],... lb,ub,[],options) Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the default valueof the function tolerance, and constraints were satisfied to within the default value of the constraint tolerance. Active inequalities (to within options.ConstraintTolerance = 1e-006): lower upper ineqlin ineqnonlin 1 x = 1.0e-007 * 0 0.1614 fval = -2.6059e-016 exitflag = 1
Al evaluar ffun
en puntos factibles cercanos, se observa que la solución x
no es un mínimo real:
[ffun([0,.001]),ffun([0,-.001]),... ffun([.001,-.001]),ffun([.001,.001])] ans = 1.0e-003 * -0.0010 -0.0010 0.9960 1.0000
Los primeros dos valores enumerados son menores que el mínimo fval
calculado.
Si cuenta con licencia para Global Optimization Toolbox, puede utilizar la función patternsearch
(Global Optimization Toolbox) para comprobar los puntos cercanos.
3. Comprobar la función objetivo y la función de restricción
Vuelva a verificar la función objetivo y la función de restricción para asegurarse de que se correspondan con el problema que se intenta resolver. Sugerencias:
Compruebe la evaluación de la función objetivo en varios puntos.
Compruebe que todas las restricciones de desigualdad tengan el signo correcto.
Si ha realizado una maximización, recuerde tomar el negativo de la solución indicada. (Este consejo asume que ha maximizado una función minimizando el negativo del objetivo). Por ejemplo, para maximizar f(x) = x – x2, minimice g(x) = –x + x2:
options = optimoptions('fminunc','Algorithm','quasi-newton'); [x fval] = fminunc(@(x)-x+x^2,0,options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. x = 0.5000 fval = -0.2500
El máximo de f es 0,25, el negativo de
fval
.Compruebe que un punto no factible no cause ningún error en las funciones; consulte Las iteraciones pueden vulnerar las restricciones.