Когда решатель отказывает

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

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

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

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

Установите Display опция для 'iter'. Этот параметр показывает результаты итераций решателя.

Включение итерационного отображения в 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для примера являются слишком маленькими, решатель может не распознать, когда он достиг минимума; это может сделать бесполезные итерации бесконечно.

Для изменения допусков в командной строке используйте optimoptions как описано в разделе «Задать и изменить опции».

The 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. Обеспечьте градиент или якобиан

Если вы не предоставляете градиенты или якобианы, решатели оценивают градиенты и якобианы по конечным различиям. Поэтому предоставление этих производных может сэкономить вычислительное время и может привести к повышенной точности. Основанный на подходе , основанном на проблеме может автоматически обеспечивать градиенты; см. Раздел «Автоматическая дифференциация» в Optimization Toolbox.

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

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

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

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

Для примеров, использующих градиенты и якобианы, смотрите Минимизацию с Градиентом и Гессианом, Нелинейные Ограничения с Градиентами, Вычисление Градиентов и Гессианов с Помощью Symbolic Math Toolbox™, Решение Нелинейной Системы Без и Включения Якобиана и Большая Разреженная Система Нелинейных Уравнений с Якобианом Для автоматической дифференциации в основанном на проблеме подходе смотрите Эффект автоматической дифференциации в основанной на проблеме оптимизации.

7. Предоставить Гессиан

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

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

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

Сходится к недопустимой точке

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

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

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-.R., где И - положительное число. Это изменение облегчает выполнение нелинейных ограничений.

  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.

Похожие темы