Решатель остановлен, так как он достиг предела числа итераций или оценок функций, прежде чем минимизировать цель до требуемого допуска. Чтобы продолжить, попробуйте выполнить одно или несколько из следующих действий.
Установите 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Если градиенты или якобианы не предоставляются, решатели оценивают градиенты и якобианы по конечным различиям. Следовательно, предоставление этих производных может сэкономить вычислительное время и может привести к повышению точности. Подход, основанный на решении проблем, может автоматически обеспечивать градиенты; см. раздел Автоматическое дифференцирование в панели инструментов оптимизации.
Для проблем с ограничениями предоставление градиента имеет еще одно преимущество. Решатель может достичь точки x такой, что x выполнимо, но конечные различия вокруг x всегда приводят к неосуществимой точке. В этом случае решатель может выйти из строя или остановиться преждевременно. Предоставление градиента позволяет решателю продолжить работу.
Укажите градиенты или якобианы в файлах для целевой функции и нелинейных функций ограничения. Дополнительные сведения о синтаксисе см. в разделах Запись скалярных целевых функций, Запись векторных и матричных целевых функций и Нелинейные ограничения.
Чтобы проверить правильность градиента или функции якобиана, используйте CheckGradients , как описано в разделе Проверка достоверности градиентов или якобианцев.
При наличии лицензии Symbolic Math Toolbox™ можно программно вычислить градиенты и гессен. Пример см. в разделе Расчет градиентов и гессенов с помощью символьных математических Toolbox™.
Примеры использования градиентов и якобианов см. в разделах Минимизация с градиентом и гессеном, Нелинейные зависимости с градиентами, Расчет градиентов и гессенов с использованием символьных математических Toolbox™, Решение нелинейной системы без и с включением якобиана и Большая разреженная система нелинейных уравнений с якобианом. Для получения информации об автоматическом дифференцировании в подходе, основанном на проблемах, см. Эффект автоматического дифференцирования в оптимизации, основанной на проблемах.
Решатели часто работают более надежно и с меньшим количеством итераций, когда вы поставляете гессен.
Следующие решатели и алгоритмы принимают гессенов:
fmincon interior-point. Напишите гессенский как отдельную функцию. Пример см. в разделе fmincon Interior-Point Algorithm with Analytic Hessian.
fmincon trust-region-reflective. Назовите гессен третьим выводом целевой функции. Пример см. в разделе Минимизация с помощью плотных структурированных гессенских линейных уравнений.
fminunc trust-region. Назовите гессен третьим выводом целевой функции. Пример см. в разделе Минимизация с использованием градиента и гессена.
При наличии лицензии Symbolic Math Toolbox можно программно вычислять градиенты и гессен. Пример см. в разделе Расчет градиентов и гессенов с помощью символьных математических Toolbox™. Для получения информации о гессенском подходе на основе проблем см. раздел Деривативы поставки в потоке операций на основе проблем.
Обычно этот результат получается, поскольку решателю не удалось найти точку, удовлетворяющую всем ограничениям в пределах ConstraintTolerance толерантность. Однако решатель может быть расположен или запущен в осуществимой точке и сходится к неосуществимой точке. Если решатель потерял выполнимость, см. раздел Решатель потерял выполнимость. Если 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-Δ, где Δ - положительное число. Это изменение облегчает выполнение нелинейных ограничений.
Найдите возможную точку для новой функции ограничения, используя исходную целевую функцию или нулевую целевую функцию.
Если вы найдете выполнимую точку,
Уменьшить Δ
Найдите возможную точку для новой функции ограничения, начиная с ранее найденной точки.
Если вы не находите осуществимую точку, попробуйте увеличить Δ и посмотреть еще раз.
Если вы не найдете выполнимой точки, ваша проблема может быть действительно неосуществимой, что означает, что решение не существует. Снова проверьте все определения ограничений.
Если решатель был запущен в допустимой точке, но сходился к неосуществимой точке, попробуйте использовать следующие методы.
Попробуйте другой алгоритм. 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.