Когда решатель преуспевает

Что может быть неправильно, если решатель преуспел?

Решатель может сообщить, что минимизация прошла успешно, и, тем не менее, сообщенное решение может быть неправильным. Для довольно тривиального примера рассмотрите минимизацию функции f (x ) = x3 для x от -2 до 2, начиная с точки 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

Истинный минимум происходит в   x = -2. fmincon приводит этот отчет, потому что функция f (x) настолько плоская около  x = 0.

Другой распространенной задачей является то, что решатель находит локальный минимум, но вам может потребоваться глобальный минимум. Для получения дополнительной информации смотрите Локальный и Глобальный оптимумы.

Урок: проверяйте свои результаты, даже если решатель сообщает, что «нашел» локальный минимум, или «решил» уравнение.

В этом разделе приведены методы проверки результатов.

1. Изменение начальной точки

Начальная точка может оказать большой эффект на решение. Если вы получаете те же или худшие решения из различных начальных точек, вы становитесь более уверенными в своем решении.

Для примера минимизируйте f (x ) = x3 + x4 начиная с точки 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

Измените начальную точку на небольшую величину, и решатель найдет лучшее решение:

[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 является глобальным решением; начиная с других точек, невозможно улучшить решение.

Для получения дополнительной информации смотрите Локальный и Глобальный оптимумы.

2. Проверяйте близлежащие точки

Чтобы увидеть, есть ли лучшие значения, чем сообщаемое решение, оцените свою целевую функцию и ограничения в различных ближайших точках.

Для примера с целевой функцией ffun из What Can Be Wrong Если решатель преуспел?, и конечной точки   xfinal = -1.5056e-008, вычислить ffun(xfinal±Δ) для некоторых Δ:

delta = .1;
[ffun(xfinal),ffun(xfinal+delta),ffun(xfinal-delta)]

ans =
   -0.0000    0.0011   -0.0009

Целевая функция ниже на ffun(xfinal-Δ), поэтому решатель сообщил о неправильном решении.

Менее тривиальный пример:

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

Оценка ffun в ближайших допустимых точках показывает, что решение x не является истинным минимумом:

[ffun([0,.001]),ffun([0,-.001]),...
    ffun([.001,-.001]),ffun([.001,.001])]

ans =
  1.0e-003 *
   -0.0010   -0.0010    0.9960    1.0000

Первые два перечисленных значения меньше вычисленного минимума fval.

Если у вас есть лицензия Global Optimization Toolbox, можно использовать patternsearch (Global Optimization Toolbox) для проверки ближайших точек.

3. Проверяйте свои целевые и ограничительные функции

Дважды проверяйте вашу целевую функцию и ограничительные функции, чтобы убедиться, что они соответствуют задаче, которую вы намерены решить. Предложения:

  • Проверьте оценку вашей целевой функции в нескольких точках.

  • Проверяйте, что каждое ограничение неравенства имеет правильный знак.

  • Если вы выполнили максимизацию, не забудьте принять отрицательное значение сообщённого решения. (Этот совет принимает, что вы максимизировали функцию путем минимизации противоположного значения цели.) Для примера максимизировать f (x ) =  x - x2, минимизируйте 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

    Максимальное значение f составляет 0,25, отрицательное значение fval.

  • Проверяйте, что недопустимая точка не вызывает ошибки в ваших функциях; см. Итерации могут нарушать ограничения.