Решатели могут занять чрезмерное время по разным причинам. Чтобы диагностировать причину или включить более быстрое решение, используйте один или несколько из следующих методов.
Установите 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
опция раздел «Проверка валидности градиентов или якобийцев».
Если вы используете большую, произвольную границу (верхнюю или нижнюю), решатель может взять чрезмерное время или даже не сходиться. Однако, если вы задаете 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 иссякнет память или время. Вот несколько предложений по использованию меньшей памяти:
Используйте крупномасштабный алгоритм, если это возможно (см. «Алгоритмы большого и среднего масштаба»). Эти алгоритмы включают trust-region-reflective
, interior-point
, а fminunc
trust-region
алгоритм, fsolve
trust-region-dogleg
алгоритм и Levenberg-Marquardt
алгоритм. Напротив, active-set
, quasi-newton
, и sqp
алгоритмы не являются крупномасштабными.
Совет
Если вы используете крупномасштабный алгоритм, то используйте разреженные матрицы для своих линейных ограничений.
Используйте функцию умножения якобиана или функцию умножения Гессиана. Для примеров см. Функцию умножения якобиана с линейными методами наименьших квадратов, Квадратичная минимизация с плотными, Структурированный Гессиан и Минимизация с плотными структурированными Гессианами, Линейными равенствами.
Если у вас есть лицензия Parallel Computing Toolbox™, ваш решатель может работать быстрее, используя параллельные вычисления. Для получения дополнительной информации см. Раздел «Параллельные вычисления».