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

Конечный пункт равняется начальной точке

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

Если вы не уверены, что начальная точка является действительно локальным минимумом, попробуйте:

  1. Запуск с различных точек — видит Изменение Начальная Точка.

  2. Проверка, что цель и ограничения заданы правильно (например, они возвращают правильные значения в некоторых точках?) — смотрите Проверку ваши Функции Цели и Ограничения. Проверяйте, что неосуществимая точка не вызывает ошибку в ваших функциях; смотрите, что Итерации Могут Нарушить Ограничения.

  3. Изменяя допуски, такие как OptimalityTolerance, ConstraintTolerance и StepTolerance — видят Использование Соответствующие Допуски.

  4. При масштабировании проблемы, таким образом, каждая координата имеет о том же эффекте — смотрите Перешкалу проблема.

  5. Обеспечение градиента и информации о Гессиане — видит, Обеспечивают Аналитические Градиенты или якобиан и Обеспечивают Гессиан.

Локальный возможный минимум

Решатель может достигнуть локального минимума, но не может быть бесспорным, потому что мерой по оптимальности первого порядка не являются меньше, чем допуск OptimalityTolerance. (Чтобы узнать больше о мере по оптимальности первого порядка, смотрите Меру по Оптимальности Первого порядка.), Чтобы видеть, надежно ли решение, о котором сообщают, рассмотрите следующие предложения.

1. Несглаженные функции
2. Повторно выполните запуск в конечном пункте
3. Попробуйте различный алгоритм
4. Измените допуски
5. Повторно масштабируйте проблему
6. Проверка поблизости указывает
7. Измените конечные опции дифференцирования
8. Обеспечьте аналитические градиенты или якобиан
9. Обеспечьте гессиан

1. Несглаженные функции

При попытке минимизировать несглаженную функцию или иметь несглаженные ограничения, “Локальный Минимум, Возможный”, может быть лучшим выходным сообщением. Это вызвано тем, что условия оптимальности первого порядка не применяются в несглаженной точке.

Чтобы убедиться, что решение соответствует, попытайтесь Проверять Соседние Точки.

2. Повторно выполните запуск в конечном пункте

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

Например, рассмотрите следующую проблему минимизации, взятую из примера Используя Символьную Математику с Решателями Optimization Toolbox™:

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

Выходное флаговое значение 5 указывает, что мера по оптимальности первого порядка была выше функционального допуска. Запустите минимизацию, снова начинающую с 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

Локальный минимум “найден”, не “возможным”, и exitflag является 1, не 5. Эти два решения фактически идентичны. Все же второе выполнение имеет более удовлетворительное выходное сообщение, поскольку мера по оптимальности первого порядка была достаточно низкой: 7.5996e-007, вместо 3.9674e-006.

3. Попробуйте различный алгоритм

Много решателей дают вам выбор алгоритма. Различные алгоритмы могут привести к использованию различного критерия остановки.

Например, Повторное выполнение, Запускающееся В Конечном пункте, возвращает exitflag 5 в первый показ. Это выполнение использует алгоритм quasi-newton.

Алгоритм доверительной области требует предоставленного пользователями градиента. betopt.m содержит вычисление целевой функции и градиента:

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;

Выполнение оптимизации с помощью алгоритма trust-region приводит к различному exitflag:

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

Выходное условие лучше, чем условие quasi-newton, хотя это все еще не является лучшим. Повторное выполнение алгоритма от конечного пункта производит лучшую точку с чрезвычайно маленькой мерой по оптимальности первого порядка:

[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. Измените допуски

Иногда сжатие или ослабление допусков приводят к более удовлетворительному результату. Например, выберите меньшее значение OptimalityTolerance в разделе Try a Different Algorithm:

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 взял еще одну итерацию, чем прежде, найдя лучшее решение.

5. Повторно масштабируйте проблему

Попытка иметь каждую координату дает о том же эффекте на цель и ограничительные функции путем масштабирования и центрирования. Для примеров смотрите Центр и Шкалу Ваша проблема.

6. Проверка поблизости указывает

Выполните свою целевую функцию и ограничения, если они существуют в точках около конечного пункта. Если конечный пункт является локальной переменной, минимальные, соседние допустимые точки имеют большие значения целевой функции. Смотрите Проверку Соседние Точки для примера.

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

7. Измените конечные опции дифференцирования

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

Чтобы выбрать центральные различия в командной строке, используйте optimoptions, чтобы установить 'FiniteDifferenceType' на 'central' вместо 'forward' по умолчанию.

Чтобы выбрать центральные различия в приложении Оптимизации, установите Options > Approximated derivatives > Type быть central differences.

8. Обеспечьте аналитические градиенты или якобиан

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

Для ограниченных проблем, обеспечивая градиент имеет преимущество. Решатель может достигнуть точки x, таким образом, что x является выполнимыми, но конечными разностями вокруг x, всегда приводят к неосуществимой точке. В этом случае решатель может перестать работать или остановиться преждевременно. Обеспечение градиента позволяет решателю продолжать.

Обеспечьте градиенты или Якобианы в файлах для вашей целевой функции и нелинейных ограничительных функций. Для получения дополнительной информации синтаксиса, смотрите Пишущие Скалярные Целевые функции, Пишущий Векторные и Матричные Целевые функции и Нелинейные Ограничения.

Чтобы проверять, что ваш градиент или Функция Якоби правильны, используйте опцию CheckGradients, как описано в Проверке Валидности Градиентов или Якобианов.

Если у вас есть лицензия Symbolic Math Toolbox™, можно вычислить градиенты и Гессианы программно. Для примера смотрите, что Symbolic Math Toolbox Вычисляет Градиенты и Гессианы.

Для примеров с помощью градиентов и Якобианов, смотрите Минимизацию с Градиентом и Гессианом, Нелинейными Ограничениями с Градиентами, Symbolic Math Toolbox Вычисляет Градиенты и Гессианы, Нелинейные уравнения с Аналитическим якобианом и Нелинейные уравнения с якобианом.

9. Обеспечьте гессиан

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

Следующие решатели и алгоритмы принимают Гессианы:

Если у вас есть лицензия Symbolic Math Toolbox, можно вычислить градиенты и Гессианы программно. Для примера смотрите, что Symbolic Math Toolbox Вычисляет Градиенты и Гессианы.

Пример в Symbolic Math Toolbox Вычисляет Градиенты, и Гессианы показывает fmincon, берущий 77 итераций без Гессиана, но только 19 итераций с Гессианом.