exponenta event banner

Создание кода в fmincon Фон

Что такое создание кода?

Генерация кода - это преобразование кода MATLAB ® в код C с помощью Coder™ MATLAB. Для создания кода требуется лицензия MATLAB Coder.

Как правило, генерация кода используется для развертывания кода на оборудовании, на котором не работает MATLAB. Например, можно развернуть код на роботе, используя fmincon для оптимизации движения или планирования.

Пример см. в разделе Создание кода для fmincon. Сведения о создании кода в других решателях оптимизации см. в разделах Генерация кода для fsolve, Генерация кода для quadprog или Генерация кода для lsqcurvefit или lsqnonlin.

Требования к созданию кода

  • fmincon поддерживает генерацию кода с помощью codegen (Кодер MATLAB) или приложение Кодер MATLAB. Для создания кода необходимо иметь лицензию кодера MATLAB.

  • Целевое оборудование должно поддерживать стандартные вычисления с плавающей запятой с двойной точностью. Невозможно создать код для вычислений с одной точностью или фиксированной точкой.

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

  • Весь код для генерации должен быть кодом MATLAB. В частности, нельзя использовать пользовательскую функцию черного ящика в качестве целевой функции для 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 функция.

  • 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).

См. также

| | (кодер MATLAB)

Связанные темы