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

Слишком много итераций или функциональных оценок

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

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 с помощью алгоритма 'quasi-newton' fminunc:

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. Если нет никакой допустимой точки, ваша проблема не хорошо сформулирована. Проверяйте определения своих границ и линейных ограничений.

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

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

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

    @(x)0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Попробуйте различный алгоритм. 'sqp' fmincon и алгоритмы 'interior-point' являются обычно самыми устойчивыми, так попробуйте один или они оба сначала.

  • Сожмите границы. Дайте самый высокий lb и самые низкие векторы ub, что вы можете. Это может помочь решателю поддержать выполнимость. 'sqp' fmincon и алгоритмы 'interior-point' повинуются границам в каждой итерации, так трудная справка границ в течение оптимизации.

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

Обычно, вы получаете это сообщение, потому что линейные ограничения противоречивы, или почти сингулярны. Чтобы проверять, существует ли допустимая точка, создайте линейную проблему программирования с теми же ограничениями и с нулевым вектором целевой функции f. Решите использование алгоритма 'dual-simplex' linprog:

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.