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

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

Решатель может сообщить, что минимизация, за которой следуют, и все же решение, о котором сообщают, может быть неправильной. Для довольно тривиального примера рассмотрите минимизацию функциональный 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 от Какого Может Быть Неправильным, Если Решатель Успешно выполняется?, и конечная точка   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.

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