Выбор алгоритма

Алгоритмы fmincon

fmincon имеет пять опций алгоритма:

  • 'interior-point' (значение по умолчанию)

  • 'trust-region-reflective'

  • 'sqp'

  • 'sqp-legacy'

  • 'active-set'

Используйте optimoptions, чтобы установить опцию Algorithm в командной строке.

Рекомендации
  • Используйте алгоритм 'interior-point' сначала.

    Для справки, если минимизация перестала работать, смотрите, Когда Сбои Решателя или Когда Решатель Может Успешно выполниться.

  • Чтобы запустить оптимизацию снова, чтобы получить больше скорости на малых и средних проблемах, попробуйте 'sqp' затем и 'active-set' в последний раз.

  • Используйте 'trust-region-reflective', когда применимо. Ваша проблема должна иметь: целевая функция включает градиент, только границы, или только линейные ограничения равенства (но не оба).

Смотрите потенциальную погрешность с алгоритмами внутренней точки.

Обоснование позади рекомендаций

  • 'interior-point' решает большие, разреженные проблемы, а также небольшие плотные проблемы. Алгоритм удовлетворяет границы во всех итерациях и может восстановиться с результатов Inf или NaN. Это - крупномасштабный алгоритм; смотрите Крупномасштабный по сравнению с Алгоритмами Средней шкалы. Алгоритм может использовать специальные методы для крупномасштабных проблем. Для получения дополнительной информации см. Алгоритм Внутренней точки в fmincon options.

  • 'sqp' удовлетворяет границы во всех итерациях. Алгоритм может восстановиться с результатов Inf или NaN. Это не крупномасштабный алгоритм; смотрите Крупномасштабный по сравнению с Алгоритмами Средней шкалы.

  • 'sqp-legacy' подобен 'sqp', но обычно медленнее и использует больше памяти.

  • 'active-set' может сделать большие шаги, который добавляет скорость. Алгоритм является эффективным на некоторых проблемах с несглаженными ограничениями. Это не крупномасштабный алгоритм; смотрите Крупномасштабный по сравнению с Алгоритмами Средней шкалы.

  • 'trust-region-reflective' требует, чтобы вы обеспечили градиент и позволяет только границы или линейные ограничения равенства, но не обоих. В рамках этих ограничений алгоритм решает и большие разреженные проблемы и небольшие плотные проблемы эффективно. Это - крупномасштабный алгоритм; смотрите Крупномасштабный по сравнению с Алгоритмами Средней шкалы. Алгоритм может использовать специальные методы, чтобы сохранить использование памяти, такое как Гессиан умножают функцию. Для получения дополнительной информации смотрите Доверительную область Отражающий Алгоритм в fmincon options.

Для описаний алгоритмов см. Ограниченные Нелинейные Алгоритмы Оптимизации.

Алгоритмы fsolve

fsolve имеет три алгоритма:

  • 'trust-region-dogleg' (значение по умолчанию)

  • 'trust-region'

  • 'levenberg-marquardt'

Используйте optimoptions, чтобы установить опцию Algorithm в командной строке.

Рекомендации
  • Используйте алгоритм 'trust-region-dogleg' сначала.

    Для справки, если fsolve перестал работать, смотрите, Когда Сбои Решателя или Когда Решатель Может Успешно выполниться.

  • Чтобы решить уравнения снова, если у вас есть якобиан, умножают функцию или хотят настроить внутренний алгоритм (см. Алгоритм Доверительной области в fsolve options), попробуйте 'trust-region'.

  • Попытайтесь синхронизировать все алгоритмы, включая 'levenberg-marquardt', найти алгоритм, который работает лучше всего над вашей проблемой.

Обоснование позади рекомендаций

  • 'trust-region-dogleg' является единственным алгоритмом, который особенно разработан, чтобы решить нелинейные уравнения. Другие пытаются минимизировать сумму квадратов функции.

  • Алгоритм 'trust-region' является эффективным на разреженных проблемах. Это может использовать специальные методы, такие как якобиан, умножают функцию для крупномасштабных проблем.

Для описаний алгоритмов смотрите, что уравнение Решает Алгоритмы.

Алгоритмы fminunc

fminunc имеет два алгоритма:

  • 'quasi-newton' (значение по умолчанию)

  • 'trust-region'

Используйте optimoptions, чтобы установить опцию Algorithm в командной строке.

Рекомендации
  • Если ваша целевая функция включает градиент, используйте   'Algorithm' = 'trust-region' и установите опцию SpecifyObjectiveGradient на true.

  • В противном случае используйте   'Algorithm' = 'quasi-newton'.

Для справки, если минимизация перестала работать, смотрите, Когда Сбои Решателя или Когда Решатель Может Успешно выполниться.

Для описаний алгоритмов см. Неограниченные Нелинейные Алгоритмы Оптимизации.

Алгоритмы наименьших квадратов

lsqlin

lsqlin имеет два алгоритма:

  • 'interior-point', значение по умолчанию

  • 'trust-region-reflective'

Используйте optimoptions, чтобы установить опцию Algorithm в командной строке.

Рекомендации
  • Попробуйте 'interior-point' сначала.

    Совет

    Для лучшей производительности, когда ваша входная матрица C будет иметь большую часть ненулевых записей, задайте C как обычную двойную матрицу. Точно так же для лучшей производительности, когда C будет иметь относительно немного ненулевых записей, задайте C как разреженный. Для получения дополнительной информации типа данных смотрите Разреженные матрицы (MATLAB). Можно также установить внутренний тип линейной алгебры при помощи опции 'LinearSolver'.

  • Если вы не имеете никаких ограничений или только связанных ограничений, и хотите более высокую точность, больше скорости, или хотите использовать якобиан, Умножают Функцию с Линейным методом наименьших квадратов, пробуют 'trust-region-reflective'.

Для справки, если минимизация перестала работать, смотрите, Когда Сбои Решателя или Когда Решатель Может Успешно выполниться.

Смотрите потенциальную погрешность с алгоритмами внутренней точки.

Для описаний алгоритмов смотрите Наименьшие квадраты (Подбор кривой Модели) Алгоритмы.

lsqcurvefit и lsqnonlin

lsqcurvefit и lsqnonlin имеют два алгоритма:

  • 'trust-region-reflective' (значение по умолчанию)

  • 'levenberg-marquardt'

Используйте optimoptions, чтобы установить опцию Algorithm в командной строке.

Рекомендации
  • Обычно попробуйте 'trust-region-reflective' сначала. Если ваша проблема имеет границы, необходимо использовать 'trust-region-reflective'.

  • Если ваша проблема не имеет никаких границ и является недоопределенной (меньше уравнений, чем размерности), используйте 'levenberg-marquardt'.

Для справки, если минимизация перестала работать, смотрите, Когда Сбои Решателя или Когда Решатель Может Успешно выполниться.

Для описаний алгоритмов смотрите Наименьшие квадраты (Подбор кривой Модели) Алгоритмы.

Линейные алгоритмы программирования

linprog имеет три алгоритма:

  • 'dual-simplex', значение по умолчанию

  • 'interior-point-legacy'

  • 'interior-point'

Используйте optimoptions, чтобы установить опцию Algorithm в командной строке.

Рекомендации

Используйте алгоритм 'dual-simplex' или алгоритм 'interior-point' сначала.

Для справки, если минимизация перестала работать, смотрите, Когда Сбои Решателя или Когда Решатель Может Успешно выполниться.

Смотрите потенциальную погрешность с алгоритмами внутренней точки.

Обоснование позади рекомендаций

  • Часто, 'dual-simplex' и алгоритмы 'interior-point' быстры, и используют наименьшее количество памяти.

  • Алгоритм 'interior-point-legacy' подобен 'interior-point', но 'interior-point-legacy' может быть медленнее, менее устойчивым, или использовать больше памяти.

Для описаний алгоритмов см. Линейные Алгоритмы Программирования.

Алгоритмы квадратичного программирования

quadprog имеет два алгоритма:

  • 'interior-point-convex' (значение по умолчанию)

  • 'trust-region-reflective'

Используйте optimoptions, чтобы установить опцию Algorithm в командной строке.

Рекомендации
  • Если у вас есть выпуклая проблема, или если вы не знаете, выпукла ли ваша проблема, используйте 'interior-point-convex'.

  • Совет

    Для лучшей производительности, когда ваша матрица Гессиана H будет иметь большую часть ненулевых записей, задайте H как обычную двойную матрицу. Точно так же для лучшей производительности, когда H будет иметь относительно немного ненулевых записей, задайте H как разреженный. Для получения дополнительной информации типа данных смотрите Разреженные матрицы (MATLAB). Можно также установить внутренний тип линейной алгебры при помощи опции 'LinearSolver'.

  • Если у вас есть невыпуклая проблема только с границами, или только с линейными равенствами, используйте 'trust-region-reflective'.

Для справки, если минимизация перестала работать, смотрите, Когда Сбои Решателя или Когда Решатель Может Успешно выполниться.

Смотрите потенциальную погрешность с алгоритмами внутренней точки.

Для описаний алгоритмов см. Алгоритмы Квадратичного программирования.

Крупномасштабный по сравнению с алгоритмами средней шкалы

Алгоритмом оптимизации является large scale, когда это использует линейную алгебру, которая не должна хранить, ни работать с, полные матрицы. Это может быть сделано внутренне путем хранения разреженных матриц, и при помощи линейной алгебры для разреженных матриц для вычислений, когда это возможно. Кроме того, внутренние алгоритмы или сохраняют разреженность, такую как разреженное разложение Холесского, или не генерируют матрицы, такие как метод сопряженных градиентов.

Напротив, методы medium-scale внутренне создают полные матрицы и используют плотную линейную алгебру. Если проблема является достаточно большой, полные матрицы поднимают существенное количество памяти, и плотная линейная алгебра может потребовать, чтобы долгое время выполнилось.

Не позволяйте имени “крупный масштаб”, вводят в заблуждение вас; можно использовать крупномасштабный алгоритм на небольшой проблеме. Кроме того, вы не должны задавать разреженные матрицы, чтобы использовать крупномасштабный алгоритм. Выберите алгоритм средней шкалы, чтобы получить доступ к дополнительной функциональности, такой как дополнительные типы ограничения, или возможно для лучшей производительности.

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

Алгоритмы внутренней точки в fmincon, quadprog, lsqlin и linprog имеют много хороших характеристик, таких как низкое использование памяти и способность решить большие проблемы быстро. Однако их решения могут быть немного менее точными, чем те из других алгоритмов. Причина этой потенциальной погрешности состоит в том, что (внутренне расчетный) барьерная функция сохраняет, выполняет итерации далеко от контуров ограничения неравенства.

В наиболее практических целях эта погрешность является обычно довольно маленькой.

Чтобы уменьшать погрешность, попытайтесь:

  • Повторно выполните решатель с меньшим StepTolerance, OptimalityTolerance, и возможно допусками ConstraintTolerance (но сохраните допуски разумными.) Смотрите Допуски и Критерий остановки).

  • Запустите различный алгоритм, начинающий с решения внутренней точки. Это может перестать работать, потому что некоторые алгоритмы могут использовать чрезмерную память или время, и весь linprog и некоторые алгоритмы quadprog не принимают начальную точку.

Например, попытайтесь минимизировать функциональный x, когда ограничено ниже 0. Используя значение по умолчанию fmincon алгоритм interior-point:

options = optimoptions(@fmincon,'Algorithm','interior-point','Display','off');
x = fmincon(@(x)x,1,[],[],[],[],0,[],[],options)
x =

   2.0000e-08

Используя алгоритм sqp fmincon:

options.Algorithm = 'sqp';
x2 = fmincon(@(x)x,1,[],[],[],[],0,[],[],options)
x2 =

   0

Точно так же решите ту же проблему с помощью алгоритма interior-point-legacy linprog:

opts = optimoptions(@linprog,'Display','off','Algorithm','interior-point-legacy');
x = linprog(1,[],[],[],[],0,[],1,opts)
x =

   2.0833e-13

Используя алгоритм dual-simplex linprog:

opts.Algorithm = 'dual-simplex';
x2 = linprog(1,[],[],[],[],0,[],1,opts)
x2 =

     0

В этих случаях алгоритмы внутренней точки менее точны, но ответы вполне близко к правильному ответу.

Для просмотра документации необходимо авторизоваться на сайте