Решатель остановился, потому что достиг предела количества итераций или вычислений функции, прежде чем он минимизировал цель до запрошенного допуска. Чтобы продолжить, попробуйте одно или несколько из следующих действий.
Установите Display
опция для 'iter'
. Этот параметр показывает результаты итераций решателя.
Включение итерационного отображения в MATLAB® командная строка, введите
options = optimoptions('solvername','Display','iter');
Вызовите решатель, используя options
структура.
Пример итерационного отображения см. в разделе Результат интерпретации.
Что искать в итерационном отображении
Посмотрите, является ли целевая функция (Fval
или f(x)
или Resnorm
) уменьшается. Уменьшение указывает на прогресс.
Исследуйте нарушение ограничений (Max constraint
) чтобы убедиться, что он уменьшается к 0
. Уменьшение указывает на прогресс.
Посмотрите, уменьшается ли оптимальность первого порядка к 0
. Уменьшение указывает на прогресс.
Посмотрите, Trust-region radius
ли уменьшается до небольшого значения. Это уменьшение указывает на то, что цель может быть не сглаженной.
Что делать
Если бы решатель, казалось, прогрессировал:
Задайте MaxIterations
и/или MaxFunctionEvaluations
к значениям, большим, чем значения по умолчанию. Значения по умолчанию можно увидеть в таблице Опции (Options) на страницах с описанием функции решателя.
Запустите решатель из последней вычисленной точки.
Если решатель не прогрессирует, попробуйте другие перечисленные предложения.
Если StepTolerance
или OptimalityTolerance
для примера являются слишком маленькими, решатель может не распознать, когда он достиг минимума; это может сделать бесполезные итерации бесконечно.
Для изменения допусков в командной строке используйте optimoptions
как описано в разделе «Задать и изменить опции».
The 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
использование fminunc
'quasi-newton'
алгоритм:
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
Если вы не предоставляете градиенты или якобианы, решатели оценивают градиенты и якобианы по конечным различиям. Поэтому предоставление этих производных может сэкономить вычислительное время и может привести к повышенной точности. Основанный на подходе , основанном на проблеме может автоматически обеспечивать градиенты; см. Раздел «Автоматическая дифференциация» в 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™. Для предоставления Гессиана в основанном на проблеме подходе смотрите Производные по поставкам в Рабочем процессе, основанном на проблеме.
Обычно вы получаете этот результат, потому что решатель не смог найти точку, удовлетворяющую всем ограничениям в ConstraintTolerance
допуск. Однако решатель мог обнаружить или запустить в допустимой точке и сходиться к недопустимой точке. Если решатель потерял допустимость, см. «Решатель потерял допустимость». Если quadprog
возвращает этот результат, см. Quadprog Converges в недопустимую точку
Чтобы продолжить, когда решатель не найдет допустимую точку, попробуйте одно или несколько из следующих.
1. Проверяйте линейные ограничения |
2. Проверяйте нелинейные ограничения |
Попробуйте найти точку, которая удовлетворяет границам и линейным ограничениям, решив задачу линейного программирования.
Задайте задачу линейного программирования с целевой функцией, которая всегда равна нулю:
f = zeros(size(x0)); % assumes x0 is the initial point
Решите задачу линейного программирования, чтобы увидеть, существует ли допустимая точка:
xnew = linprog(f,A,b,Aeq,beq,lb,ub);
Если существует допустимая точка xnew
, использовать xnew
в качестве начальной точки и повторите вашу исходную задачу.
Если нет допустимой точки, ваша проблема не хорошо сформулирована. Проверьте определения границ и линейных ограничений. Для получения дополнительной информации о проверке линейных ограничений смотрите Исследование линейных Infeasibilities.
Убедившись, что ограничения и линейные ограничения допустимы (содержат точку, удовлетворяющую всем ограничениям), проверяйте нелинейные ограничения.
Установите свою целевую функцию, чтобы нуль:
@(x)0
Запустите оптимизацию со всеми ограничениями и с нулевой целью. Если вы находите допустимую точку xnew
, задать x0 = xnew
и повторите вашу первоначальную задачу.
Если вы не находите допустимую точку с помощью нулевой целевой функции, используйте нулевую целевую функцию с несколькими начальными точками.
Если вы находите допустимую точку xnew
, задать x0 = xnew
и повторите вашу первоначальную задачу.
Если вы не нашли допустимую точку, попробуйте ослабить ограничения, обсуждаемые далее.
Попробуйте расслабить свои нелинейные ограничения неравенства, затем ужесточить их.
Измените нелинейную функцию ограничения c
для возврата c-
.R., где И - положительное число. Это изменение облегчает выполнение нелинейных ограничений.
Найдите допустимую точку для новой ограничительной функции, используя либо вашу исходную целевую функцию, либо нулевую целевую функцию.
Если вы находите допустимую точку,
Уменьшите
Найдите допустимую точку для новой функции ограничения, начиная с ранее найденной точки.
Если вы не находите допустимую точку, попробуйте увеличить
Если вы не найдете допустимой точки, ваша проблема может быть действительно недопустимой, что означает, что никакого решения не существует. Проверьте все свои определения ограничений еще раз.
Если решатель начал в допустимой точке, но сходился к недопустимой точке, попробуйте следующие методы.
Попробуйте другой алгоритм. fmincon
'sqp'
и 'interior-point'
алгоритмы обычно наиболее устойчивы, поэтому сначала попробуйте один или оба из них.
Затяните границы. Дайте наивысшую lb
и самые низкие ub
векторы, которые вы можете. Это может помочь решателю сохранить допустимость. fmincon
'sqp'
и 'interior-point'
алгоритмы подчиняются границам при каждой итерации, поэтому жесткие границы помогают на протяжении всей оптимизации.
quadprog
Сходится к недопустимой точкеОбычно вы получаете это сообщение, потому что линейные ограничения противоречивы или почти сингулярны. Чтобы проверить, существует ли допустимая точка, создайте задачу линейного программирования с теми же ограничениями и с нулевым вектором целевой функции f
. Решить с помощью linprog
'dual-simplex'
алгоритм:
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
.