Встраиваемые приложения могут иметь требования, которые ограничивают, сколько времени код может запуститься прежде, чем дать ответ. Такие требования могут быть проблематичными, потому что fmincon
не дает гарантий времени оптимизации. Эта тема обрисовывает в общих чертах методы для оценки, сколько времени ваш встроенный код запустится прежде, чем возвратить результат и описывает изменения, которые можно внести в код, чтобы сократить требование времени.
Для общих рекомендаций по записи эффективного кода для генерации кода смотрите Конструктивные соображения кода MATLAB для Генерации кода (MATLAB Coder).
Чтобы оценить время выполнения сгенерированного кода перед генерацией кода, установите свою среду MATLAB® совпадать с целевым окружением максимально тесно.
Проверяйте тактовые частоты своего целевого компьютера и своего компьютера. Масштабируйтесь ваше сравнительное тестирование заканчивается соответственно.
Если у вас есть лицензия Embedded Coder®, смотрите эти темы для получения дополнительной информации о надежных способах оценить получившуюся производительность вашего встроенного кода: Ускорьте Линейную алгебру в Коде, Сгенерированном от блока MATLAB function (Embedded Coder), Ускорьте Матричные операции в Коде, Сгенерированном от блока MATLAB function (Embedded Coder), Верификация (Embedded Coder) и Производительность (Embedded Coder).
Чтобы установить настройку для генерации кода, вызовите coder.config
.
cfg = coder.config('mex');
Чтобы сэкономить время в сгенерированном коде, выключите проверки целостности и проверки на целочисленное насыщение. fmincon
не использует эти проверки, чтобы функционировать правильно, принимая, что целевая функция и нелинейная ограничительная функция не требуют их. Для получения дополнительной информации смотрите Проверки на этапе выполнения Управления (MATLAB Coder).
cfg.IntegrityChecks = false; cfg.SaturateOnIntegerOverflow = false;
Как правило, сгенерированный код запускается быстрее при использовании выделения статического ЗУ, несмотря на то, что выделение это может увеличить сумму сгенерированного кода. Кроме того, некоторое оборудование не поддерживает динамическое выделение памяти. Чтобы использовать выделение статического ЗУ, задайте эту установку.
cfg.DynamicMemoryAllocation = 'Off';
Можно улучшать производительность кода путем выбора различного BLAS, базовых подпрограмм линейной алгебры. Чтобы изучить, как установить BLAS для вашего сгенерированного кода, смотрите, Ускоряют Матричные операции в Сгенерированном Автономном Коде при помощи Вызовов BLAS (MATLAB Coder). Если вы хотите, чтобы встраиваемое приложение запустилось параллельно, необходимо предоставить библиотеки BLAS или LAPACK, которые поддерживают параллельный расчет в системе. Точно так же, когда у вас есть параллельное оборудование, можно улучшать производительность кода путем установки пользовательских вызовов LAPACK. Смотрите Ускоряют Линейную алгебру в Сгенерированном Автономном Коде при помощи Вызовов LAPACK (MATLAB Coder).
fmincon
Запустите свой сгенерированный код MEX в цикле тысячи оценок с помощью набора входных параметров, который типичен для приложения. Найдите и общее время и максимум времен оценки. Попробуйте параметры, что вы думаете, может вызвать fmincon
занять слишком много времени, и протестировать их и другие параметры. Если приложение MEX возвратит удовлетворительные результаты в удовлетворительные времена, то можно ожидать, что развертываемое приложение будет, также.
fmincon
Одним из наиболее важных факторов, влияющих и на время выполнения и на качество решения, является начальная точка для оптимизации x0
. Когда параметры медленно изменяются между fmincon
вызовы, решение от предыдущего вызова обычно является точкой хорошего начала для следующего cal. Смотрите Следуют за Решением для уравнения как за параметром Изменения, который также показывает, как скачок во время решения может произойти, потому что решение переключает Области притяжения.
Если ваша задача оптимизации не имеет параметров, изменяющихся медленно, и включает только несколько контрольных переменных, то попытка оценить ответ из предыдущих решений может стоить. Создайте модель решения как функция параметров, или как квадратичное в параметрах или как низко-размерная интерполяция, и используйте предсказанную точку решения в качестве стартовой точки для fmincon
.
Можно иногда ускорять решение путем тонкой настройки параметров. Если вы устанавливаете MaxIterations
опция, чтобы позволить всего несколько итераций, затем fmincon
остановки быстро.
opts = optimoptions('fmincon','Algorithm','sqp','MaxIterations',50); [x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Однако результат может быть далек от оптимума. Убедитесь, что неточный результат не чрезмерно воздействует на вашу систему. Установите MaxIterations
как можно больше, все еще соответствуя вашему ограничению времени. Можно оценить это значение путем измерения, сколько времени итерация берет, или путем измерения, сколько времени функциональная оценка берет, и затем любая установка MaxFunctionEvaluations
опция или MaxIterations
опция. Для примера смотрите Генерацию кода для Основ Оптимизации.
Для дальнейших предложений на настройках, которые могут ускорить fmincon
, смотрите, что Решатель Занимает слишком много времени. Обратите внимание на то, что некоторые предложения в той теме не применяются из-за ограничений в fmincon
генерация кода. Смотрите Генерацию кода в fmincon.
Вы можете хотеть глобальный минимум, не только локальный минимум, как решение. Для предложений смотрите Поиск Меньшего Минимума. Поиск глобального минимума может занять много времени и, как гарантируют, не будет работать.
codegen
| fmincon
| optimoptions