Когда решатель перестал работать

Слишком много итераций или вычислений функции

Решатель остановился, потому что он достиг предела на количестве итераций или вычислений функции, прежде чем он минимизировал цель к требуемому допуску. Чтобы продолжить, попробуйте один или несколько следующих.

1. Включите итеративное отображение
2. Ослабьте допуски
3. Запустите решатель с различных точек
4. Проверяйте определения функции цели и ограничения
5. Сосредоточьте и масштабируйте свою проблему
6. Предоставьте градиент или якобиан
7. Обеспечьте гессиан

1. Включите итеративное отображение

Установите 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 уменьшения к маленькому значению. Это уменьшение указывает, что объективная сила не является гладкой.

Что сделать

  • Если решатель, казалось, прогрессировал:

    1. Установите MaxIterations и/или MaxFunctionEvaluations к значениям, больше, чем значения по умолчанию. Вы видите значения по умолчанию в приложении Оптимизации, или в таблице Options на страницах ссылки на функцию решателя.

    2. Запустите решатель с его последней расчетной точки.

  • Если решатель не прогрессирует, попробуйте другие перечисленные предложения.

2. Ослабьте допуски

Если StepTolerance или OptimalityTolerance, например, слишком малы, решатель не может распознать, когда он достиг минимума; это может сделать бесполезные итерации неопределенно.

Чтобы изменить допуски с помощью приложения Оптимизации, используйте список Stopping criteria наверху панели Options.

Чтобы изменить допуски в командной строке, используйте optimoptions как описано в Опциях Набора и Изменения.

FiniteDifferenceStepSize опция (или DiffMaxChange и DiffMinChange опции), может влиять на прогресс решателя. Эти опции управляют размером шага в конечном дифференцировании для производной оценки.

3. Запустите решатель с различных точек

Смотрите изменяют начальную точку.

4. Проверяйте определения функции цели и ограничения

Например, проверяйте, что ваши объективные и нелинейные ограничительные функции возвращают правильные значения в некоторых точках. Смотрите Проверку ваши Функции Цели и Ограничения. Проверяйте, что неосуществимая точка не вызывает ошибку в ваших функциях; смотрите, что Итерации Могут Нарушить Ограничения.

5. Сосредоточьте и масштабируйте свою проблему

Решатели запускаются более надежно, когда каждая координата имеет о том же эффекте на ограничительных функциях и цели. Умножьте свои координатные направления с соответствующими скалярами, чтобы компенсировать эффект каждой координаты. Добавьте соответствующие значения в определенные координаты, чтобы компенсировать их размер.

Пример: Центрирование и Масштабирование.  Рассмотрите минимизацию   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

6. Предоставьте градиент или якобиан

Если вы не предоставляете градиенты или Якобианы, решатели оценивают градиенты и Якобианы конечными разностями. Поэтому обеспечение этих производных может сэкономить вычислительное время и может привести к увеличенной точности.

Для ограниченных проблем, предоставляя градиент имеет преимущество. Решатель может достигнуть точки x таким образом, что x выполнимые, но конечные разности вокруг x всегда приводите к неосуществимой точке. В этом случае решатель может перестать работать или остановиться преждевременно. Предоставление градиента позволяет решателю продолжать.

Предоставьте градиенты или Якобианы в файлах для вашей целевой функции и нелинейных ограничительных функций. Для получения дополнительной информации синтаксиса, смотрите Пишущие Скалярные Целевые функции, Пишущий Векторные и Матричные Целевые функции и Нелинейные Ограничения.

Чтобы проверять, что ваш градиент или Функция Якоби правильны, используйте CheckGradients опция, как описано в Проверке Валидности Градиентов или Якобианов.

Если у вас есть лицензия Symbolic Math Toolbox™, можно вычислить градиенты и Гессианы программно. Для примера смотрите, что Symbolic Math Toolbox™ Вычисляет Градиенты и Гессианы.

Для примеров с помощью градиентов и Якобианов, смотрите Минимизацию с Градиентом и Гессианом, Нелинейными Ограничениями с Градиентами, Symbolic Math Toolbox™ Вычисляет Градиенты и Гессианы, Нелинейные уравнения с Аналитическим якобианом и Нелинейные уравнения с якобианом.

7. Обеспечьте гессиан

Решатели часто запускаются более надежно и с меньшим количеством итераций, когда вы предоставляете Гессиан.

Следующие решатели и алгоритмы принимают Гессианы:

Если у вас есть лицензия Symbolic Math Toolbox, можно вычислить градиенты и Гессианы программно. Для примера смотрите, что Symbolic Math Toolbox™ Вычисляет Градиенты и Гессианы.

Сходившийся к неосуществимой точке

Обычно, вы получаете этот результат, потому что решатель не мог найти точку, удовлетворяющую всем ограничениям к в ConstraintTolerance допуск. Однако решатель может расположиться или запуститься в допустимой точке и сходиться к неосуществимой точке. Если решатель потерял выполнимость, смотрите Решатель Потерянная Выполнимость. Если quadprog возвращает этот результат, см., что quadprog Сходится к Неосуществимой Точке

Чтобы продолжить, когда решатель не нашел допустимой точки, попробуйте один или несколько следующих.

1. Проверяйте линейные ограничения
2. Проверяйте нелинейные ограничения

1. Проверяйте линейные ограничения

Попытайтесь найти точку, которая удовлетворяет границам и линейным ограничениям путем решения задачи линейного программирования.

  1. Задайте задачу линейного программирования с целевой функцией, которая всегда является нулем:

    f = zeros(size(x0)); % assumes x0 is the initial point
  2. Решите задачу линейного программирования, чтобы видеть, существует ли допустимая точка:

    xnew = linprog(f,A,b,Aeq,beq,lb,ub);
  3. Если существует допустимая точка xnew, используйте xnew как начальная точка и повторно выполненный ваша исходная проблема.

  4. Если нет никакой допустимой точки, ваша проблема не хорошо сформулирована. Проверяйте определения своих границ и линейных ограничений. Для получения дополнительной информации при проверке линейных ограничений, смотрите, Исследуют Линейный Infeasibilities.

2. Проверяйте нелинейные ограничения

После обеспечения, что ваши границы и линейные ограничения выполнимы (содержат точку, удовлетворяющую всем ограничениям), проверяйте свои нелинейные ограничения.

  • Обнулите свою целевую функцию:

    @(x)0

    Запустите свою оптимизацию со всеми ограничениями и с нулевой целью. Если вы находите допустимую точку xnew, установите x0 = xnew и повторно выполненный ваша исходная проблема.

  • Если вы не находите, что допустимая точка с помощью нулевой целевой функции, использует нулевую целевую функцию с несколькими начальными точками.

    • Если вы находите допустимую точку xnew, установите x0 = xnew и повторно выполненный ваша исходная проблема.

    • Если вы не находите допустимую точку, попытайтесь ослабить ограничения, обсужденные затем.

Попытайтесь ослабить свои нелинейные ограничения неравенства, затем сжав их.

  1. Измените нелинейную ограничительную функцию c возвратить c-Δ, где Δ является положительным числом. Это изменение делает ваши нелинейные ограничения легче удовлетворить.

  2. Ищите допустимую точку для новой ограничительной функции, с помощью или исходной целевой функции или нулевой целевой функции.

    1. Если вы находите допустимую точку,

      1. Уменьшайте Δ

      2. Ищите допустимую точку для новой ограничительной функции, запускающейся в ранее найденной точке.

    2. Если вы не находите допустимую точку, попытайтесь увеличить Δ и смотреть снова.

Если вы не находите допустимой точки, ваша проблема может быть действительно неосуществимой, означая, что никакое решение не существует. Проверяйте все свои ограничительные определения снова.

Решатель потерянная выполнимость

Если решатель, запущенный в допустимой точке, но, сходился к неосуществимой точке, попробуйте следующие методы.

  • Попробуйте различный алгоритм. 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 может не решить уравнение по различным причинам. Вот некоторые предложения для того, как продолжить:

  1. Попытайтесь изменить начальную точку. fsolve использует начальную точку. Путем предоставления ему различных начальных точек вы увеличиваете шансы на успех.

  2. Проверяйте определение уравнения, чтобы убедиться, что это является гладким. fsolve может не сходиться для уравнений с прерывистыми градиентами, такими как абсолютное значение. fsolve может не сходиться для функций с разрывами.

  3. Проверяйте, что уравнение является “квадратным”, означая равные размерности для ввода и вывода (имеет то же количество неизвестных как значения уравнения).

  4. Измените допуски, особенно OptimalityTolerance и StepTolerance. При попытке получить высокую точность путем устанавливания погрешностей очень маленьким значениям, fsolve может не сходиться. Если вы устанавливаете погрешности, которые слишком высоки, fsolve может не решить уравнение точно.

  5. Проверяйте описание задачи. Некоторые проблемы не имеют никакого действительного решения, такого как     x^2 + 1 = 0.

Похожие темы