exponenta event banner

Решатель занимает слишком много времени

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

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

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

Для включения итеративного отображения в командной строке MATLAB ® введите

options = optimoptions('solvername','Display','iter');

Вызовите решатель с помощью options структура.

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

Использование соответствующих допусков

Решатели могут не сходиться, если допуски слишком малы, особенно OptimalityTolerance и StepTolerance.

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

Использование функции печати

Можно получить более визуальную или подробную информацию об итерациях решателя с помощью функции печати. В разделе Опции (Options) страниц ссылок на функции решателя перечислены функции печати.

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

options = optimoptions('solvername','PlotFcn',{@plotfcn1,@plotfcn2,...});

Вызовите решатель с помощью options структура.

Пример использования функции печати см. в разделе Использование функции печати.

Использовать 'lbfgs' HessianApproximation Выбор

Для fmincon решатель, если у вас есть проблема со многими переменными (сотни или более), то часто вы можете сэкономить время и память, установив HessianApproximation опция для 'lbfgs'. Это приводит к fmincon 'interior-point' алгоритм использования малопамятного гессенского приближения.

Включить StartGradients

Если в решатель введены производные (градиенты или якобианы), решатель может не сойтись, если производные неточны. Для получения дополнительной информации об использовании CheckGradients см. раздел Проверка достоверности градиентов или якобианцев.

Использовать INF вместо большой произвольной границы

Если используется большое произвольное ограничение (верхнее или нижнее), решатель может занять слишком много времени или даже не сойтись. Однако, если задать Inf или -Inf в качестве границы решатель может занимать меньше времени и может лучше сходиться.

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

Второстепенная точка: некоторые решатели используют память для каждого ограничения, в основном через ограничение Гессен. Установка привязки к Inf или -Inf означает, что ограничения отсутствуют, поэтому используется меньше памяти, поскольку ограничение Гессена имеет меньшую размерность.

Использование функции вывода

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

Пример использования функции вывода см. в разделе Функции вывода для Toolbox™ оптимизации.

Попробовать другие параметры алгоритма

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

Некоторые другие варианты могут оказать значительное влияние на время решения:

  • fmincon 'interior-point' алгоритм - Попробуйте установить BarrierParamUpdate опция для 'predictor-corrector'.

  • 'SubproblemAlgorithm' вариант 'trust-region' или 'trust-region-reflective' алгоритм многих решателей - попробуйте установить 'SubproblemAlgorithm' кому 'factorization' вместо значения по умолчанию 'cg'.

  • coneprog - Для большой разреженной проблемы попробуйте установить LinearSolver опция для 'prodchol', 'schur', или 'normal'. Для плотной проблемы попробуйте установить LinearSolver опция для 'augmented'.

  • quadprog 'interior-point-convex' алгоритм или lsqlin 'interior-point' алгоритм - Попробуйте установить LinearSolver опция для 'sparse' или 'dense'.

Использование разреженного решателя или функции умножения

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

Использовать параллельные вычисления

Если у вас есть лицензия Parallel Computing Toolbox™, ваш решатель может работать быстрее, используя параллельные вычисления. Дополнительные сведения см. в разделе Параллельные вычисления.