exponenta event banner

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

Алгоритмы fmincon

fmincon имеет пять вариантов алгоритма:

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

  • 'trust-region-reflective'

  • 'sqp'

  • 'sqp-legacy'

  • 'active-set'

Использовать optimoptions для установки Algorithm в командной строке.

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

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

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

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

См. раздел Потенциальная неточность алгоритмов внутренних точек.

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

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

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

  • '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'

  • 'active-set'

Использовать optimoptions для установки Algorithm в командной строке.

Рекомендации
  • Попробуй 'interior-point' во-первых.

    Совет

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

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

  • Если имеется большое количество линейных ограничений, а не большое количество переменных, попробуйте 'active-set'.

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

См. раздел Потенциальная неточность алгоритмов внутренних точек.

Описание алгоритмов см. в разделе Алгоритмы наименьших квадратов (подгонки модели).

lsqcurvefit и lsqnonlin

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

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

  • 'levenberg-marquardt'

Использовать optimoptions для установки Algorithm в командной строке.

Рекомендации
  • Как правило, попробуйте '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'

  • 'active-set'

Использовать optimoptions для установки Algorithm в командной строке.

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

  • Совет

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

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

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

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

См. раздел Потенциальная неточность алгоритмов внутренних точек.

Описание алгоритмов см. в разделе Алгоритмы квадратичного программирования.

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

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

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

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

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

Алгоритмы внутренних точек в 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

Использование fmincon sqp алгоритм:

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

   0

Аналогично, решить ту же задачу с помощью linprog interior-point-legacy алгоритм:

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

   2.0833e-13

Использование linprog dual-simplex алгоритм:

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

     0

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