Начальная точка, по-видимому, является локальным минимумом или решением, потому что мера оптимальности первого порядка близка к 0. Вы можете быть недовольны этим результатом, поскольку решатель не улучшил вашу начальную точку.
Если вы не уверены, что начальная точка действительно является локальным минимумом, попробуйте:
Начиная с разных точек - см. «Изменение начальной точки».
Проверка, что ваша цель и ограничения заданы правильно (для примера, они возвращают правильные значения в некоторых точках?) - см. «Проверка ваших целевых и ограничительных функций». Проверяйте, что недопустимая точка не вызывает ошибки в ваших функциях; см. Итерации могут нарушать ограничения.
Изменение допусков, таких как OptimalityTolerance
, ConstraintTolerance
, и StepTolerance
- см. Использование соответствующих допусков.
Масштабирование вашей задачи, чтобы каждая координата имела примерно одинаковый эффект - см. «Перешкала задачи».
Предоставление градиентной и гессианской информации - см., Обеспечивают аналитические градиенты или якобиан и Обеспечивают гессианца.
Решатель мог достичь локального минимума, но не может быть уверен, потому что мера оптимальности первого порядка не меньше OptimalityTolerance
допуск. (Чтобы узнать больше о мере оптимальности первого порядка, см. «Мера оптимальности первого порядка».) Чтобы увидеть, является ли представленное решение надежным, примите во внимание следующие предложения.
Если вы пытаетесь минимизировать функцию nonsmooth или имеете ограничения nonsmooth, «Local Minimum Possible» может быть лучшим выходным сообщением. Это связано с тем, что условия оптимальности первого порядка не применяются в немонтированной точке.
Чтобы убедиться, что решение адекватно, попробуйте проверить близлежащие точки.
Перезапуск оптимизации в конечной точке может привести к решению с лучшей мерой оптимальности первого порядка. Лучшая (более низкая) мера оптимальности первого порядка дает вам больше оснований полагать, что ответ надежен.
Например, рассмотрим следующую задачу минимизации, взятую из примера Использование Символьной Математики с 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
.
Многие решатели дают вам выбор алгоритма. Различные алгоритмы могут привести к использованию различных критериев остановки.
Для примера 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: []
Иногда ужесточение или ослабление допусков приводит к более удовлетворительному результату. Например, выберите меньшее значение 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
взял еще одну итерацию, чем раньше, придя к лучшему решению.
Постарайтесь, чтобы каждая координата давала примерно одинаковый эффект на функции цели и ограничения путем масштабирования и центрирования. Для примеров смотрите Центр и Шкалу вашей задачи.
Оцените свою целевую функцию и ограничения, если они существуют, в точках около конечной точки. Если конечная точка является локальным минимумом, близкие допустимые точки имеют большие значения целевой функции. Пример см. в разделе Проверка ближайших точек.
Если у вас есть лицензия Global Optimization Toolbox, попробуйте запустить patternsearch
Решатель (Global Optimization Toolbox) из конечной точки. patternsearch
исследует близлежащие точки и принимает все типы ограничений.
Центральные конечные различия являются более длительными для оценки, но намного более точными. Используйте центральные различия, когда ваша задача может иметь высокую кривизну.
Чтобы выбрать центральные различия в командной строке, используйте optimoptions
для установки 'FiniteDifferenceType'
на 'central'
, вместо 'forward' по умолчанию
.
Если вы не предоставляете градиенты или якобианы, решатели оценивают градиенты и якобианы по конечным различиям. Поэтому предоставление этих производных может сэкономить вычислительное время и может привести к повышенной точности. Основанный на подходе , основанном на проблеме может автоматически обеспечивать градиенты; см. Раздел «Автоматическая дифференциация» в Optimization Toolbox.
Для ограниченных задач, обеспечение градиента имеет другое преимущество. Решатель может достичь точки x
таким образом x
допустимо, но конечные различия вокруг x
всегда приводят к недопустимой точке. В этом случае решатель может ошибиться или остановиться преждевременно. Предоставление градиента позволяет решателю продолжить.
Предоставьте градиенты или якобианы в файлах для вашей целевой функции и нелинейных ограничительных функций. Для получения дополнительной информации о синтаксисе смотрите Запись Скалярных Целевых Функций, Запись Векторных и Матричных Целевых Функций и Нелинейные Ограничения.
Чтобы проверить, что ваша градиентная или якобианская функция верна, используйте CheckGradients
опция, как описано в «Проверке валидности градиентов или якобийцев».
Если у вас есть лицензия Symbolic Math Toolbox™, можно вычислить градиенты и Гессианы программно. Для получения примера смотрите Вычисление градиентов и Гессианов Использование Symbolic Math Toolbox™.
Для примеров, использующих градиенты и якобианы, смотрите Минимизацию с Градиентом и Гессианом, Нелинейные Ограничения с Градиентами, Вычисление Градиентов и Гессианов с Помощью Symbolic Math Toolbox™, Решение Нелинейной Системы Без и Включения Якобиана и Большая Разреженная Система Нелинейных Уравнений с Якобианом Для автоматической дифференциации в основанном на проблеме подходе смотрите Эффект автоматической дифференциации в основанной на проблеме оптимизации.
Решатели часто запускаются более надежно и с меньшим количеством итераций, когда вы поставляете Гессиана.
Следующие решатели и алгоритмы принимают Гессианы:
fmincon
interior-point
. Напишите Гессиана как отдельную функцию. Для получения примера смотрите fmincon Алгоритм внутренней точки с аналитическим Гессианом.
fmincon
trust-region-reflective
. Дайте Гессиану в качестве третьего выхода целевой функции. Для получения примера смотрите Минимизацию с плотной структурированной Гессианской, Линейных Равенств.
fminunc
trust-region
. Дайте Гессиану в качестве третьего выхода целевой функции. Для получения примера смотрите Минимизацию с Градиентом и Гессианом.
Если у вас есть лицензия Symbolic Math Toolbox, можно вычислить градиенты и Гессианы программно. Для получения примера смотрите Вычисление градиентов и Гессианов Использование Symbolic Math Toolbox™. Для предоставления Гессиана в основанном на проблеме подходе смотрите Производные по поставкам в Рабочем процессе, основанном на проблеме.
Пример в Вычислении Градиентов и Гессианов с Использованием Symbolic Math Toolbox™ показывает fmincon
принимая 77 итераций без Гессиана, но только 19 итераций с Гессианом.