Решатель остановился, потому что он достиг предела на количестве итераций или функциональных оценок, прежде чем он минимизировал цель к требуемому допуску. Чтобы продолжить, попробуйте один или несколько следующих.
Установите опцию Display
на 'iter'
. Эта установка показывает результаты итераций решателя.
Включить итеративное отображение:
Используя приложение Оптимизации, выберите Level of display, чтобы быть iterative
или iterative with detailed message
.
В командной строке MATLAB® войти
options = optimoptions('solvername','Display','iter');
Вызовите решатель с помощью структуры options
.
Для примера итеративного отображения смотрите, Интерпретируют Результат.
Что искать в итеративном отображении
Смотрите, уменьшается ли целевая функция (Fval
или f(x)
или Resnorm
). Уменьшение указывает на прогресс.
Исследуйте ограничительное нарушение (Max constraint
), чтобы гарантировать, что это уменьшается к 0
. Уменьшение указывает на прогресс.
Смотрите, уменьшается ли оптимальность первого порядка к 0
. Уменьшение указывает на прогресс.
Смотрите, уменьшается ли Trust-region radius
до маленького значения. Это уменьшение указывает, что объективная сила не сглаженна.
Что сделать
Если решатель, казалось, прогрессировал:
Установите MaxIterations
и/или MaxFunctionEvaluations
к значениям, больше, чем значения по умолчанию. Вы видите значения по умолчанию в приложении Оптимизации, или в таблице Options на страницах ссылки на функцию решателя.
Запустите решатель с его последней расчетной точки.
Если решатель не прогрессирует, попробуйте другие перечисленные предложения.
Если StepTolerance
или OptimalityTolerance
, например, являются слишком маленькими, решатель не может распознать, когда это достигло минимума; это может сделать бесполезные итерации неопределенно.
Чтобы изменить допуски с помощью приложения Оптимизации, используйте список Stopping criteria наверху панели Options.
Чтобы изменить допуски в командной строке, используйте optimoptions
, как описано в Опциях Набора и Изменения.
Опция FiniteDifferenceStepSize
(или DiffMaxChange
и опции DiffMinChange
) может влиять на прогресс решателя. Эти опции управляют размером шага в конечном дифференцировании для производной оценки.
Смотрите изменяют начальную точку.
Например, проверяйте, что ваши объективные и нелинейные ограничительные функции возвращают правильные значения в некоторых точках. Смотрите Проверку ваши Функции Цели и Ограничения. Проверяйте, что неосуществимая точка не вызывает ошибку в ваших функциях; смотрите, что Итерации Могут Нарушить Ограничения.
Решатели запускаются более надежно, когда каждая координата имеет о том же эффекте на ограничительные функции и цель. Умножьте свои координатные направления с соответствующими скалярами, чтобы компенсировать эффект каждой координаты. Добавьте соответствующие значения в определенные координаты, чтобы компенсировать их размер.
Пример: Центрирование и Масштабирование. Считайте минимизацию 1e6*x(1)^2 + 1e-6*x(2)^2
:
f = @(x) 10^6*x(1)^2 + 10^-6*x(2)^2;
Минимизируйте f
с помощью алгоритма 'quasi-newton'
fminunc
:
opts = optimoptions('fminunc','Display','none','Algorithm','quasi-newton'); x = fminunc(f,[0.5;0.5],opts) x = 0 0.5000
Результат является неправильным; плохое масштабирование вмешалось в получение хорошего решения.
Масштабируйте проблему. Набор
D = diag([1e-3,1e3]); fr = @(y) f(D*y); y = fminunc(fr, [0.5;0.5], opts) y = 0 0 % the correct answer
Точно так же плохое центрирование может вмешаться в решение.
fc = @(z)fr([z(1)-1e6;z(2)+1e6]); % poor centering z = fminunc(fc,[.5 .5],opts) z = 1.0e+005 * 10.0000 -10.0000 % looks good, but... z - [1e6 -1e6] % checking how close z is to 1e6 ans = -0.0071 0.0078 % reveals a distance fcc = @(w)fc([w(1)+1e6;w(2)-1e6]); % centered w = fminunc(fcc,[.5 .5],opts) w = 0 0 % the correct answer
Если вы не обеспечиваете градиенты или Якобианы, решатели оценивают градиенты и Якобианы конечными разностями. Поэтому обеспечение этих производных может сэкономить вычислительное время и может привести к увеличенной точности.
Для ограниченных проблем, обеспечивая градиент имеет преимущество. Решатель может достигнуть точки 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 Вычисляет Градиенты и Гессианы.
Обычно, вы получаете этот результат, потому что решатель не мог найти точку, удовлетворяющую все ограничения к в допуске ConstraintTolerance
. Однако решатель может расположиться или запуститься в допустимой точке и сходиться к неосуществимой точке. Если решатель потерял выполнимость, смотрите Решатель Потерянная Выполнимость. Если quadprog
возвращает этот результат, см., что quadprog Сходится к Неосуществимой Точке
Чтобы продолжить, когда решатель не нашел допустимой точки, попробуйте один или несколько следующих.
1. Проверяйте линейные ограничения |
2. Проверяйте нелинейные ограничения |
Попытайтесь найти точку, которая удовлетворяет границы и линейные ограничения путем решения линейной проблемы программирования.
Задайте линейную проблему программирования с целевой функцией, которая всегда является нулем:
f = zeros(size(x0)); % assumes x0 is the initial point
Решите линейную проблему программирования, чтобы видеть, существует ли допустимая точка:
xnew = linprog(f,A,b,Aeq,beq,lb,ub);
Если существует допустимая точка xnew
, используйте xnew
в качестве начальной точки и повторно выполните вашу исходную проблему.
Если нет никакой допустимой точки, ваша проблема не хорошо сформулирована. Проверяйте определения своих границ и линейных ограничений.
После обеспечения, что ваши границы и линейные ограничения выполнимы (содержат точку, удовлетворяющую все ограничения), проверяйте свои нелинейные ограничения.
Обнулите свою целевую функцию:
@(x)0
Запустите свою оптимизацию со всеми ограничениями и с нулевой целью. Если вы находите допустимую точку xnew
, устанавливаете x0 = xnew
и повторно выполняете вашу исходную проблему.
Если вы не находите, что допустимая точка с помощью нулевой целевой функции, использует нулевую целевую функцию с несколькими начальными точками.
Если вы находите допустимую точку xnew
, устанавливаете x0 = xnew
и повторно выполняете вашу исходную проблему.
Если вы не находите допустимую точку, попытайтесь ослабить ограничения, обсужденные затем.
Попытайтесь ослабить свои нелинейные ограничения неравенства, затем сжав их.
Измените нелинейную ограничительную функцию c
, чтобы возвратить c-
Δ, где Δ является положительным числом. Это изменение делает ваши нелинейные ограничения легче удовлетворить.
Ищите допустимую точку для новой ограничительной функции, с помощью или исходной целевой функции или нулевой целевой функции.
Если вы находите допустимую точку,
Уменьшайте Δ
Ищите допустимую точку для новой ограничительной функции, запускающейся в ранее найденной точке.
Если вы не находите допустимую точку, попытайтесь увеличить Δ и смотреть снова.
Если вы не находите допустимой точки, ваша проблема может быть действительно неосуществимой, означая, что никакое решение не существует. Проверяйте все свои ограничительные определения снова.
Если решатель, запущенный в допустимой точке, но, сходился к неосуществимой точке, попробуйте следующие методы.
Попробуйте различный алгоритм. 'sqp'
fmincon
и алгоритмы 'interior-point'
являются обычно самыми устойчивыми, так попробуйте один или они оба сначала.
Сожмите границы. Дайте самый высокий lb
и самые низкие векторы ub
, что вы можете. Это может помочь решателю поддержать выполнимость. 'sqp'
fmincon
и алгоритмы 'interior-point'
повинуются границам в каждой итерации, так трудная справка границ в течение оптимизации.
quadprog
сходится к неосуществимой точкеОбычно, вы получаете это сообщение, потому что линейные ограничения противоречивы, или почти сингулярны. Чтобы проверять, существует ли допустимая точка, создайте линейную проблему программирования с теми же ограничениями и с нулевым вектором целевой функции f
. Решите использование алгоритма 'dual-simplex'
linprog
:
options = optimoptions('linprog','Algorithm','dual-simplex'); x = linprog(f,A,b,Aeq,beq,lb,ub,options)
Если linprog
не находит допустимой точки, то ваша проблема действительно неосуществима.
Если linprog
находит допустимую точку, то попробуйте различный алгоритм quadprog
. Также измените некоторые допуски, такие как StepTolerance
или ConstraintTolerance
и решите проблему снова.
Решатель достиг точки, целевая функция которой была меньше, чем объективный предельный допуск.
Ваша проблема может быть действительно неограниченной. Другими словами, существует последовательность точек xi с
lim f (xi) = – ∞.
и таким образом, что весь xi удовлетворяет ограничения задач.
Проверяйте, что ваша проблема формулируется правильно. Решатели пытаются минимизировать целевые функции; если вы хотите максимум, изменяете вашу целевую функцию на ее отрицание. Для примера смотрите Максимизацию Цели.
Попытайтесь масштабировать или сосредоточить вашу проблему. Смотрите Центр и Шкалу Ваша проблема.
Ослабьте объективный предельный допуск при помощи optimoptions
, чтобы уменьшать значение допуска ObjectiveLimit
.
fsolve
может не решить уравнение по различным причинам. Вот некоторые предложения для того, как продолжить:
Попытайтесь Изменить Начальную Точку. fsolve
полагается на начальную точку. Путем предоставления ему различных начальных точек вы увеличиваете шансы на успех.
Проверяйте определение уравнения, чтобы убедиться, что это сглаженно. fsolve
может не сходиться для уравнений с прерывистыми градиентами, такими как абсолютное значение. fsolve
может не сходиться для функций с разрывами.
Проверяйте, что уравнение является “квадратным”, означая равные размерности для ввода и вывода (имеет то же количество неизвестных как значения уравнения).
Измените допуски, особенно OptimalityTolerance
и StepTolerance
. При попытке получить высокую точность путем установки допусков на очень маленькие значения, fsolve
может не сходиться. Если вы устанавливаете допуски, которые слишком высоки, fsolve
может не решить уравнение точно.
Проверяйте проблемное определение. Некоторые проблемы не имеют никакого действительного решения, такого как x^2 + 1 = 0
.