Решатель принимает слишком долго

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

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

Установите 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' алгоритм для использования гессианского приближения с низким уровнем памяти.

Включите CheckGradients

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

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

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

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

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

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

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

Для примера использования выходной функции см. «Выходные функции для Optimization 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™, ваш решатель может работать быстрее, используя параллельные вычисления. Для получения дополнительной информации см. Раздел «Параллельные вычисления».