fmincon
ФонГенерация кода является преобразованием MATLAB® код для Кода С с использованием MATLAB Coder™. Для генерации кода требуется лицензия MATLAB Coder.
Как правило, генерация кода используется для развертывания кода на оборудовании, которое не работает под управлением MATLAB. Например, можно развернуть код на роботе, используя fmincon
для оптимизации движения или планирования.
Для получения примера смотрите Сгенерировать Код для fmincon. Для генерации кода в других решателях оптимизации смотрите Generate Code for fsolve, Generate Code for quadprog или Generate Code для lsqcurvefit или lsqnonlin.
fmincon
поддерживает генерацию кода, используя codegen
(MATLAB Coder) или приложение MATLAB Coder. Для генерации кода необходимо иметь лицензию MATLAB Coder.
Целевой компьютер должно поддерживать стандартные расчеты с плавающей точностью. Вы не можете сгенерировать код для расчетов с одной точностью или с фиксированной точкой.
Цели генерации кода не используют те же библиотеки математических ядер, что и решатели MATLAB. Поэтому решения генерации кода могут варьироваться от решений решателя, особенно для плохо обусловленных задач.
Весь код для генерации должен быть кодом MATLAB. В частности, вы не можете использовать пользовательскую функцию black-box в качестве целевой функции для fmincon
. Можно использовать coder.ceval
для вычисления пользовательской функции, закодированной на C или C++. Однако пользовательская функция должна вызываться в функции MATLAB.
fmincon
не поддерживает problem
аргумент для генерации кода.
[x,fval] = fmincon(problem) % Not supported
Необходимо задать целевую функцию и любую нелинейную функцию ограничения с помощью указателей на функцию, а не строк или имен символов.
x = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlcon) % Supported % Not supported: fmincon('fun',...) or fmincon("fun",...)
Все fmincon
входные матрицы, такие как A
, Aeq
, lb
, и ub
должно быть полным, а не разреженным. Вы можете преобразовать разреженные матрицы в полные с помощью full
функция.
The lb
и ub
аргументы должны иметь то же количество записей, что и x0
аргумент или должен быть пустым []
.
Для расширенной оптимизации кода с использованием встраиваемых процессоров вам также нужен Embedded Coder® лицензия.
Вы должны включить опции для fmincon
и указать их используя optimoptions
. Опции должны включать Algorithm
опция, установить на 'sqp'
или 'sqp-legacy'
.
options = optimoptions('fmincon','Algorithm','sqp'); [x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
Генерация кода поддерживает следующие опции:
Algorithm
- Должен быть 'sqp'
или 'sqp-legacy'
ConstraintTolerance
FiniteDifferenceStepSize
FiniteDifferenceType
MaxFunctionEvaluations
MaxIterations
ObjectiveLimit
OptimalityTolerance
ScaleProblem
SpecifyConstraintGradient
SpecifyObjectiveGradient
StepTolerance
TypicalX
Сгенерированный код имеет ограниченную проверку ошибок на опции. Рекомендуемый способ обновления опции - использовать optimoptions
, а не запись через точку.
opts = optimoptions('fmincon','Algorithm','sqp'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
Не загружайте опции из файла. Это может привести к сбою генерации кода. Вместо этого создайте опции в коде.
Обычно, если вы задаете опцию, которая не поддерживается, опция молчаливо игнорируется во время генерации кода. Однако, если вы задаете функцию построения графика или выходную функцию при помощи записи через точку, генерация кода может вызвать ошибку. Для надежности задайте только поддерживаемые опции.
Поскольку выходные функции и функции построения графика не поддерживаются, fmincon
не возвращает выходной флаг -1.
Код, сгенерированный из fmincon
не содержит bestfeasible
поле в возвращенном output
структура.
По умолчанию сгенерированный код для использования вне окружения MATLAB использует линейные библиотеки алгебры, которые не являются многопоточными. Поэтому этот код может запускаться значительно медленнее, чем код в среде MATLAB.
Если ваш целевой компьютер имеет несколько ядер, можно достичь лучшей эффективности с помощью пользовательских многопоточных библиотек LAPACK и BLAS. Чтобы включить эти библиотеки в ваш сгенерированный код, смотрите Ускорение Линейной Алгебры в Сгенерированном Автономном Коде при Помощи Вызовов LAPACK (MATLAB Coder).
fmincon
| optimoptions
| codegen
(MATLAB CODER)