Решатель остановился, потому что он достиг предела на количестве итераций или вычислений функции, прежде чем он минимизировал цель к требуемому допуску. Чтобы продолжить, попробуйте один или несколько следующих.
Установите 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
как описано в Опциях Набора и Изменения.
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 Сходится к Неосуществимой Точке
Чтобы продолжить, когда решатель не нашел допустимой точки, попробуйте один или несколько следующих.
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-
Δ, где Δ является положительным числом. Это изменение делает ваши нелинейные ограничения легче удовлетворить.
Ищите допустимую точку для новой ограничительной функции, с помощью или исходной целевой функции или нулевой целевой функции.
Если вы находите допустимую точку,
Уменьшайте Δ
Ищите допустимую точку для новой ограничительной функции, запускающейся в ранее найденной точке.
Если вы не находите допустимую точку, попытайтесь увеличить Δ и смотреть снова.
Если вы не находите допустимой точки, ваша проблема может быть действительно неосуществимой, означая, что никакое решение не существует. Проверяйте все свои ограничительные определения снова.
Если решатель, запущенный в допустимой точке, но, сходился к неосуществимой точке, попробуйте следующие методы.
Попробуйте различный алгоритм. 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
.