Main Content

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) = xx2, 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 Iterations Can Violate Constraints.