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

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

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

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

  1. Начиная с разных точек - см. «Изменение начальной точки».

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

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

  4. Масштабирование вашей задачи, чтобы каждая координата имела примерно одинаковый эффект - см. «Перешкала задачи».

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

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

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

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

1. Незабываемые функции

Если вы пытаетесь минимизировать функцию nonsmooth или имеете ограничения nonsmooth, «Local Minimum Possible» может быть лучшим выходным сообщением. Это связано с тем, что условия оптимальности первого порядка не применяются в немонтированной точке.

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

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. Попробуйте другой алгоритм

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

Для примера Rerun Starting At 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 алгоритм приводит к другому экситфлагу:

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 в разделе Попробовать другой алгоритм:

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 Решатель (Global Optimization Toolbox) из конечной точки. patternsearch исследует близлежащие точки и принимает все типы ограничений.

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

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

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

8. Предоставление аналитических градиентов или якобиан

Если вы не предоставляете градиенты или якобианы, решатели оценивают градиенты и якобианы по конечным различиям. Поэтому предоставление этих производных может сэкономить вычислительное время и может привести к повышенной точности. Основанный на подходе , основанном на проблеме может автоматически обеспечивать градиенты; см. Раздел «Автоматическая дифференциация» в Optimization Toolbox.

Для ограниченных задач, обеспечение градиента имеет другое преимущество. Решатель может достичь точки 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 итераций с Гессианом.