Начальная точка, кажется, локальный минимум или решение, потому что мера оптимальности первого порядка близко к 0. Вы можете быть недовольны этим результатом, поскольку решатель не улучшил вашу начальную точку.
Если вы не уверены, что начальная точка является действительно локальным минимумом, попробуйте:
Запуск с различных точек — видит Изменение Начальная Точка.
Проверка, что цель и ограничения заданы правильно (например, они возвращают правильные значения в некоторых точках?) — смотрите Проверку ваши Функции Цели и Ограничения. Проверяйте, что неосуществимая точка не вызывает ошибку в ваших функциях; смотрите, что Итерации Могут Нарушить Ограничения.
Изменяя допуски, такие как OptimalityTolerance
, ConstraintTolerance
, и StepTolerance
— смотрите Использование Соответствующие Допуски.
При масштабировании проблемы, таким образом, каждая координата имеет о том же эффекте — видят, Перемасштабируют проблему.
Предоставление градиента и информации о Гессиане — видит, Предоставляют Аналитические Градиенты или якобиан и Обеспечивают Гессиан.
Решатель может достигнуть локального минимума, но не может быть бесспорным, потому что мера оптимальности первого порядка не меньше OptimalityTolerance
допуск. (Чтобы узнать больше о мере оптимальности первого порядка, смотрите Меру оптимальности Первого порядка.), Чтобы видеть, надежно ли решение, о котором сообщают, рассмотрите следующие предложения.
При попытке минимизировать несглаженную функцию или иметь несглаженные ограничения, “Локальный Минимум, Возможный”, может быть лучшим выходным сообщением. Это вызвано тем, что условия оптимальности первого порядка не применяются в несглаженной точке.
Чтобы убедиться, что решение соответствует, попытайтесь Проверять Соседние Точки.
Перезапуск оптимизации в конечной точке может привести к решению с лучшей мерой оптимальности первого порядка. Лучшая (более низкая) мера оптимальности первого порядка приводит вам больше причины полагать, что ответ надежен.
Например, рассмотрите следующую задачу минимизации, взятую из примера Используя Символьную Математику с Решателями 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
.
Много решателей дают вам выбор алгоритма. Различные алгоритмы могут привести к использованию различного критерия остановки.
Например, Повторное выполнение, Запускающееся В 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: []
Иногда сжатие или ослабление допусков приводят к более удовлетворительному результату. Например, выберите меньшее значение 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
взял еще одну итерацию, чем прежде, найдя лучшее решение.
Попытка иметь каждую координату дает о том же эффекте на цели и ограничительных функциях путем масштабирования и центрирования. Для примеров смотрите Центр и Шкалу Ваша проблема.
Выполните свою целевую функцию и ограничения, если они существуют в точках около конечной точки. Если конечная точка является локальной переменной, минимальные, соседние допустимые точки имеют большие значения целевой функции. Смотрите Проверку Соседние Точки для примера.
Если у вас есть лицензия 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 итераций с Гессианом.