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

Final point равняется начальной точке

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Например, рассмотрите следующую задачу минимизации, взятую из примера Используя Символьную Математику с Решателями 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. Попробуйте различный алгоритм

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

Например, Повторное выполнение, Запускающееся В Final point, возвращает 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 итераций с Гессианом.